2013-03-13 21 views
6

mam aproblem z rzędu statycznej deklaracji zmiennej w C#statyczna zmienna kolejność

Gdy ten kod:

static class Program { 
    private static int v1 = 15; 
    private static int v2 = v1; 

    static void Main(string[] args) { 
    Console.WriteLine("v2 = "+v2); 
    } 
} 

Wyjście jest:

v2=15 

Ale kiedy zmieni Kolejność deklaracji zmiennej statycznej:

static class Program { 
     private static int v2 = v1; 
     private static int v1 = 15; 


     static void Main(string[] args) { 
     Console.WriteLine("v2 = "+v2); 
     } 
    } 

wyjście jest:

v2 = 0 

Dlaczego to się stało?

+2

To nie jest programowanie deklaratywne, jak w Prologu. W C# Polecenia mają zlecenie, które są uruchamiane. W tym przypadku jest to proste ... – ppeterka

+0

Czy wiesz, że jeśli zdefiniujesz v1 jak: "private const int v1 = 15;" otrzymujesz 15 zamiast 0? –

Odpowiedz

11

Pola statyczne są inicjowane w tej samej kolejności, co deklaracje. Podczas inicjalizacji v2 z wartością v1, v1 nie jest jeszcze zainicjowany, więc jej wartość wynosi 0.

3

Sposób, w jaki zmienne statyczne uzyskują wartość, oznacza, że ​​w drugim przykładzie v1 nie został zainicjalizowany, a zatem przyjmuje wartość domyślną 0, gdy jest przypisana do v2.

5

zmienne statyczne są inicjowane w kolejności ich zgłoszenia, więc podczas przypisywania v2 w drugim przykładzie v1 jeszcze jego domyślna wartość: 0.

Mam nadzieję, że wiesz, że robienie takich rzeczy jest jednak złym pomysłem.

3

Pola static zainicjalizowały tę samą kolejność zgodnie z deklaracjami.

W drugim kodzie v1 nie został zainicjowany. Od v1 jest Int32, więc jest to typ wartości o typie, a domyślną wartością wszystkich typów wartości jest 0.

Od C# 4.0 w skrócie na stronie 74.

inicjalizatory statyczne pole uruchamiane w takiej kolejności, w których pola są zadeklarowana.

W twoim przypadku;

private static int v2 = v1; 
// v2 initialized 0 because of the default value of value types. 
private static int v1 = 15; 
// v1 initialized 15 
Powiązane problemy