2009-09-29 25 views
38

biorąc pod uwagę następujący kod:Inicjowanie Order statycznych pól statycznych klasy

public static class Helpers 
{ 
    private static Char[] myChars = new Char[] {'a', 'b'}; 

    private static Int32 myCharsSize = myChars.Length; 
} 

To jest zagwarantowane, że myChars zostaną zainicjowane przed używam jej długość przypisać myCharsSize?

Odpowiedz

43

Tak, będzie można zobaczyć 10.4.5.1 Static field initialization:

Pole statyczne zmienne inicjalizatory klasy odpowiadają sekwencji zadań, które są wykonywane w kolejności tekstowej, w jakiej występują w deklaracja klasy. Jeśli statyczny konstruktor (rozdział 10.11) istnieje w klasę, wykonanie statycznych inicjalizatorów polowych występuje natychmiast przed wykonaniem tego statycznego konstruktora. W przeciwnym razie inicjatory polowe ze stajniami są wykonywane w czasie zależnym od implementacji przed pierwszym zastosowaniem tego pola w statycznym polu o wartości .

Uważam, że lepiej byłoby wykonać inicjalizację wewnątrz statycznego inicjalizatora typu (konstruktor statyczny).

+3

Dbasz o dowody? –

+2

Znacznie lepiej ;-p –

+0

@Marc - LOL, napisałem "tak", więc byłbym pierwszy, a następnie wróciłem z dowodami. Ponieważ nie mogę już być FGTW, chyba nie powinienem się martwić, że będę pierwszy raz: D –

11

Hmm ... Jestem zaskoczony, że kompiluje (sprawdza, sprawdziłem). Nie znam żadnej gwarancji, która by to uczyniła bezpiecznym. Użyj konstruktora statycznego ...


EDIT: I accept (patrz better answer above), że to będzie działać; ale moim pomysłem z kodem jest utrzymywanie go tak prostego i oczywistego, jak to tylko możliwe. Jeśli nie jest to oczywiste,, że będzie działać (i nie może być, jeśli musisz zapytać), to nie pisz tego w ten sposób ...

W szczególności problemy z poleganiem na kolejności w terenie :

  • może złamać jeśli przenieść kod dookoła (co często robią)
  • może złamać jeśli podzielić kod na partial klas

Moja rada pozostaje: używać statycznego konstruktor ten scenariusz.

+1

+1 Ta rada jest dobra - tylko dlatego, że możesz zrobić coś, co nie znaczy, że powinieneś. Sądzę, że statyczny konstruktor to sposób, aby przejść tutaj, mimo że język obsługuje tego typu inicjalizację pól. –

+0

Chociaż można napisać znacznie bardziej zwięzły kod za pomocą statycznych inicjatorów właściwości pola/pola (wpisanie nazwy właściwości raz na właściwość zamiast podwójnej - raz w definicji i raz w statycznej funkcji inicjalizującej). W niektórych przypadkach może to być różnica między dopasowaniem pliku źródłowego na jednym ekranie lub wymaganiem przewijania, aby zobaczyć w całości. Zależy od tego, jaki jest Twój cel. Jeśli chcesz tekstowo rozłożyć właściwości w innej kolejności, niż wymagają one inicjalizacji, to tak, ręcznie napisana funkcja inicjalizatora statycznego jest Twoim jedynym wyborem. – binki

0

Na pierwszy rzut oka nie byłbym pewien i musiałem go wypróbować, aby sprawdzić, czy się skompilował.

Biorąc to pod uwagę, zainicjowałbym wartość w konstruktorze statycznym.