2011-02-14 22 views
5

estoy tratando de entender exactamente cuando los campos estáticos vienen a la existencia y se han de leer este artículo de MSDN - http://msdn.microsoft.com/en-us/library/79b3xss3 - pero parece contradecirse:¿Cuándo comienzan a existir los campos estáticos?

Primero dice:

Los miembros estáticos se inicializan antes de que se acceda al miembro estático por primera vez y antes de que se llame al constructor estático, si hay alguno.

Pero luego pasa a decir:

Si su clase contiene los campos estáticos, proporcionar un constructor estático que ellos se inicializa cuando se carga la clase.

Entonces, mi pregunta es básicamente esta: ¿Cuándo se inicializan realmente los campos estáticos y cuándo aparecen por primera vez? ¿Es antes de que se llame al constructor estático, durante o después?

¡Muchas gracias!

+5

Bueno, cuando un campo de mamá y un campo de papá se aman mucho ... –

+0

Es sorprendentemente complicado. Ver el artículo de Jon sobre el tema para más detalles: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx –

Respuesta

7

El C estados de especificación # Language (en 10.5.5.1 Static field initialization):

El campo estático inicializadores variables de una clase se corresponde con una secuencia de tareas que se ejecutan en el orden textual en la que aparecen en la declaración de clase. Si existe un constructor estático (§10.12) en la clase, la ejecución de los inicializadores de campo estáticos ocurre inmediatamente antes de ejecutar ese constructor estático. De lo contrario, los inicializadores de campo estáticos se ejecutan en un momento dependiente de la implementación antes del primer uso de un campo estático de esa clase

Creo que la orientación en su segunda línea es en realidad inicializar campos estáticos que no están terminados en línea, usando inicializadores de campo. En ese caso, debe usar un constructor estático para garantizar que se inicializarán antes del uso.

Como puede ver en la especificación, el "tiempo" real en que aparecen es específico de la implementación y está sujeto a cambios. La única garantía es que existirán antes de que se llame al constructor estático, lo que siempre ocurrirá antes de su uso en el código. Esta especificación estados (en 10,12):

La ejecución de un constructor estático es activado por el primero de los siguientes eventos a ocurrir dentro de un dominio de aplicación:

· Se crea una instancia del tipo de clase.

· Se hace referencia a cualquiera de los miembros estáticos del tipo de clase.

+0

Muchas gracias :-) –

1

Se garantiza que los campos estáticos se inicialicen antes del primer uso de la clase.

Opcionalmente, puede proporcionar un constructor estático para controlar la inicialización estática en el momento en que ocurre.

2

Es como campos "normales". Entonces antes del constructor estático. Puede verificar con un programa muy simple.

El orden es:

  • campos estáticos
  • constructor estático
  • campos "normales"
  • constructor "normal"

Un programa de ejemplo:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Start"); 
     int b = A.B; 
     Console.WriteLine("Read A.B"); 
     new A(); 
     Console.WriteLine("Built A"); 
    } 
} 

class A 
{ 
    public static int B = mystaticfunc(); 

    static int mystaticfunc() { 
     Console.WriteLine("Static field"); 
     return 1; 
    } 

    static A() 
    { 
     Console.WriteLine("Static constructor"); 
    } 

    int C = myfunc(); 

    static int myfunc() 
    { 
     Console.WriteLine("Field"); 
     return 1; 
    } 

    public A() 
    { 
     Console.WriteLine("Constructor"); 
    } 
} 

de salida:

Start 
Static field 
Static constructor 
Read A.B 
Field 
Constructor 
Built A 
1

El CLR no tiene conceptos separados de miembro de inicialización estática y constructor estático. En su lugar, solo hay un inicializador de tipo .

El compilador de C# escribe este tipo inicializador, primero inicializa los miembros estáticos, luego incluye el código de cualquier constructor estático que haya definido.

Cuestiones relacionadas