2011-11-27 17 views
11

El siguiente código:¿Por qué la inicialización de los campos estáticos ocurre antes del constructor estático?

static void Main(string[] args) 
{ 
    Console.WriteLine("0"); 
    string h = Foo.X; 
    Console.WriteLine("2"); 
} 

public static class Foo 
{ 
    public static string X = ((Func<string, string>)delegate(string g) 
    { 
     Console.WriteLine(g); 
     return (g); 
    })("_aaa"); 

    static Foo() 
    { 
     Console.WriteLine("ctor"); 
    } 
} 

imprimirá:

0 
_aaa 
ctor 
2 

que sé sobre el comportamiento beforefieldinit (con/sin constructor estática, etc.).

Lo que he No entender es por qué el ctor (en la salida) es después_aaa?

No tiene ningún sentido, ¿y si quiero inicializar variables en el constructor?

Pregunta

¿Por qué la inicialización de X es antes de la ctor?

+0

Es similar para campos no estáticos y constructores no estáticos, por supuesto: 'clase Foo {public string X =" A "; public Foo() {X = "B"; }} 'Con esto, si haces' (new Foo()). X', obtienes '" B "', no '" A "', porque la asignación de '" B "' pasó la última vez (sobreescribió la primera valor). –

+0

@JeppeStigNielsen Gracias por aclarar –

Respuesta

17

La razón por la que ctor está después de los inicializadores de campo es porque así es como se especifica. De la especificación de C# (énfasis es mío):

10.5.5.1 estáticas inicialización campo El campo inicializadores variable estática de una clase corresponden a una secuencia de tareas que se ejecutan en el orden textual en el que aparecen en el clase declaración. Si existe un constructor estático (§10.12) en la clase, la ejecución de los inicializadores de campo estáticos se produce inmediatamente antes de ejecutando ese constructor estático. De lo contrario, el campo inicializadores estáticos se ejecutan en un tiempo dependiente de la implementación antes de la el primer uso de un campo estático de la clase

Si desea tener un control total de su orden de inicialización, se mueve todo dentro del constructor

+0

gracias ... –

Cuestiones relacionadas