2009-11-13 12 views
9

Jeśli jeden statyczny element danych zależy od innego statycznego elementu danych, czy C#/.NET gwarantuje, że zależny element statyczny zostanie zainicjowany przed zależnym elementem?Czy C# rozwiązuje automatycznie zależności między statycznymi elementami danych?

Na przykład, mamy jedną klasę jak:

class Foo 
{ 
    public static string a = "abc"; 

    public static string b = Foo.a + "def"; 
} 

Kiedy Foo.b jest dostępne, jest to zawsze "abcdef" lub może być "def"?

Jeśli nie jest to zagwarantowane, czy istnieje lepszy sposób na upewnienie się, że zainicjowany członek został zainicjowany jako pierwszy?

Odpowiedz

9

Jak wspomniano wcześniej, inicjalizacja pola statycznego jest deterministyczna i przebiega zgodnie z kolejnością deklaracji tekstowych.

Weź to na przykład:

class Foo 
{ 
    public static string b = a + "def"; 
    public static string a = "abc"; 
} 

Foo.b zawsze będzie skutkować "def".

Zresztą, gdy istnieje zależność między pól statycznych, lepiej jest użyć statycznego inicjatora:

class Foo 
{ 
    public static string b; 
    public static string a; 

    static Foo() 
    { 
     a = "abc"; 
     b = a + "def"; 
    } 
} 

ten sposób jawnie wyrazić swoje zaniepokojenie kolejności inicjalizacji; lub zależność dla tej sprawy (nawet jeśli kompilator nie pomoże, jeśli przypadkowo zamienisz instrukcje inicjalizacyjne.) Powyższe będzie miało oczekiwane wartości zapisane w aib (odpowiednio "abc" i "abcdef").

Jednak pewne rzeczy mogą się kręcić (i specyficzne dla implementacji) w celu inicjalizacji pól statycznych zdefiniowanych w wielu klasach. Sekcja 10.4.5.1 Static field initialization specyfikacji językowej mówi o tym więcej.

2

Pokaże zawsze "abcdef", ponieważ inicjalizacja trafia z góry w dół, tak jak poprzednio.

Wszystkie statyczne elementy zostaną zainicjowane po załadowaniu stylu klasy, który je zawiera.

+0

Co z kolei oznacza, że ​​jeśli programista konserwacyjny zamieni te dwie linie, tak, że b = a + "def" pojawi się jako pierwszy, b zostanie zainicjowany jako "def", ponieważ a ma wartość zerową, gdy inicjalizowano b. To znaczy. robiąc coś takiego, bierzesz zależność od kolejności deklaracji. – itowlson

Powiązane problemy