2013-03-13 10 views
6

Ich habe aproblem mit der Reihenfolge der statischen Deklaration von Variablen in C#statische Variable Ordnung

Wenn ich diesen Code ausführen:

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

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

Die Ausgabe lautet:

v2=15 

Aber wenn ich ändern Die Deklaration der statischen Variablen wie folgt lautet:

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


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

Die Ausgabe lautet:

v2 = 0 

Warum dies geschah?

+2

Dies ist keine deklarative Programmierung, wie in Prolog. In C# Befehle haben eine Reihenfolge, die sie ausgeführt werden. In diesem Fall ist es einfach ... – ppeterka

+0

Wussten Sie, dass, wenn Sie v1 wie definieren: 'private const int v1 = 15;' Du bekommst 15 statt 0? –

Antwort

11

Die statischen Felder werden in der gleichen Reihenfolge wie die Deklarationen initialisiert. Wenn Sie v2 mit dem Wert von v1 initialisieren, wird v1 noch nicht initialisiert, so dass ihr Wert 0.

3

Die Art, wie statische Variablen ihren Wert erhalten, bedeutet, dass im zweiten Beispiel v1 nicht initialisiert ist und daher den Standardwert 0 annimmt, wenn es v2 zugewiesen ist.

5

Statische Variablen ist in der Reihenfolge ihrer Deklaration initialisiert werden, so dass, wenn Sie v2 in Ihrem zweiten Beispiel zuweisen, v1 noch hat sein Standardwert 0.

Ich hoffe, Sie wissen, dass es eine schlechte Idee ist, solche Dinge zu tun.

3

Die Felder static initialisiert dieselbe Reihenfolge wie folgt ihre Deklarationen. In Ihrem zweiten Code ist v1 nicht initialisiert. Da v1 ist Int32, so ist es ein Werttyp, und alle Werttypen Standardwert ist 0.

Von C# 4.0 in a Nutshell auf Seite, in der 74.

Statische Feld Initialisierungen in der Reihenfolge ausgeführt, die Felder sind erklärt.

In Ihrem Fall;

private static int v2 = v1; 
// v2 initialized 0 because of the default value of value types. 
private static int v1 = 15; 
// v1 initialized 15 
Verwandte Themen