2011-11-27 9 views
11

Poniższy kod:Dlaczego inicjalizacja pól statycznych występuje przed konstruktorem statycznym?

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"); 
    } 
} 

wypisze:

0 
_aaa 
ctor 
2 

wiem o zachowanie beforefieldinit (z/bez konstruktora statycznego itp.)

Rzecz która ja nie zrozumieć, dlaczego ctor (na wyjściu) jest po_aaa?

Nie ma sensu, co jeśli chcę zainicjować zmienne w konstruktorze?

Pytanie

Dlaczego inicjalizacji X jest przed ctor?

+0

Podobnie jest w przypadku pól niestatycznych i konstruktów niestatycznych, oczywiście: 'class Foo {public string X =" A "; public Foo() {X = "B"; }} 'Z tym, jeśli zrobisz' (new Foo()). X', otrzymasz '" B "', a nie '" A "', ponieważ przypisanie '" B "' stało się ostatnim (nadpisanie pierwszego wartość). –

+0

@JeppeStigNielsen Dzięki za wyjaśnienia –

Odpowiedz

17

Powód: ctor jest po inicjalizatorach pól, ponieważ jest to sposób, w jaki jest określony. Od specyfikacji C# (podkreślenie moje):

10.5.5.1 Inicjowanie statyczne pole statyczne zmienne pole inicjalizatory z klasy odpowiadają sekwencji zadań, które są wykonywane w kolejności tekstowej, w jakiej występują w deklaracja klasy . Jeśli w klasie istnieje konstruktor statyczny (§ 10.12), wykonanie inicjalizatorów pól statycznych następuje przed wykonaniem tego statycznego konstruktora przed wykonaniem . W przeciwnym przypadku statycznego pola inicjalizatory są wykonywane na czas realizacji zależny przed pierwszym użyciem statycznego pola tej klasy

Jeśli chcesz mieć całkowitą kontrolę nad swoim kolejności inicjalizacji, przenieść to wszystko wewnątrz konstruktora.

+0

wielkie dzięki ... –

Powiązane problemy