2010-05-29 29 views
41

se llevará a cabo un constructor estático de una clase genérica para cada tipo se pasa en el parámetro genérico como este:C# Genérico estático Constructor

class SomeGenericClass<T> 
{ 
     static List<T> _someList; 
     static SomeGenericClass() 
     { 
      _someList = new List<T>(); 
     } 
} 

¿Hay algunas pegas a la utilización de este enfoque?

Respuesta

52

Sí, se llamará al constructor estático una vez para cada tipo de clase cerrada (el tipo creado cuando se especifican los parámetros de tipo). Consulte C# 3 specification, §10.12 constructores estáticos.

El constructor estático para un tipo de clase cerrado se ejecuta como máximo una vez en un dominio de aplicación determinado.

y también:

Debido a que el constructor estático se ejecuta exactamente una vez para cada cerrados construidos tipo de clase, que es un lugar conveniente para hacer cumplir los controles de tiempo de ejecución en el parámetro de tipo que no puede ser consultado a las tiempo de compilación mediante restricciones (§10.1.5). Por ejemplo, el siguiente tipo utiliza un constructor estático para hacer valer el argumento de que tipo es una enumeración:

class Gen<T> where T: struct 
{ 
    static Gen() { 
     if (!typeof(T).IsEnum) { 
      throw new ArgumentException("T must be an enum"); 
     } 
    } 
} 

También es relevante para leer §4.4.2 abierto y cerrado tipos:

En tiempo de ejecución, todo el código dentro de una declaración de tipo genérico se ejecuta en el contexto de un tipo construido cerrado que se creó aplicando argumentos de tipo a la declaración genérica. Cada parámetro de tipo dentro del tipo genérico está vinculado a un tipo de tiempo de ejecución particular. El procesamiento en tiempo de ejecución de todas las declaraciones y expresiones siempre ocurre con tipos cerrados, y los tipos abiertos ocurren solo durante el procesamiento en tiempo de compilación.

Cada tipo de construcción cerrada tiene su propio conjunto de variables estáticas, que no se comparten con ningún otro tipo de construcción cerrada.

Este programa que se puede ejecutar a sí mismo demuestra que el constructor estático se llama tres veces, no sólo una vez:

public class Program 
{ 
    class SomeGenericClass<T> 
    { 
     static SomeGenericClass() 
     { 
      Console.WriteLine(typeof(T)); 
     } 
    } 

    class Baz { } 

    static void Main(string[] args) 
    { 
     SomeGenericClass<int> foo = new SomeGenericClass<int>(); 
     SomeGenericClass<string> bar = new SomeGenericClass<string>(); 
     SomeGenericClass<Baz> baz = new SomeGenericClass<Baz>(); 
    } 
} 

Salida:

 
System.Int32 
System.String 
Program+Baz 
+0

¿Cómo es eso una clase estática? –

+5

@Jouke van der Maas, ¿quién habló sobre una clase estática? La pregunta es sobre el constructor estático de una clase genérica, no una clase estática ... –

+0

Esto no fue ninguno, así que todavía se aplica :) –

0

Sí, los miembros estáticos y los constructores de tipos genéricos son específicos de un parámetro genérico y se ejecutarán para todos los tipos diferentes. No hay inconvenientes reales. Solo tenga cuidado al refaccionar una clase no genérica en una genérica.

0

Sí, se ejecutará para todos los tipos que suministre, ya que para cada tipo diferente se obtiene un tipo diferente.

2

va a trabajar, pero un nuevo 'instancia' se creará para cada tipo que use.

Cuestiones relacionadas