2016-12-11 1 views
0

deklariert ich bin in der Lage erfolgreich das folgende Programm kompilieren und ausführen:Wie kommen statische Variable verwendbar selbst ist, bevor es in C#

class MyClass1 
{ 
    public static int x = y; 
    public static int y = 10; 
} 

static void Main(string[] args) 
{ 
    Console.WriteLine(MyClass1.x); //prints 0 
    Console.WriteLine(MyClass1.y); //prints 10 
} 

Warum erfolgreich kompiliert wird? Wie erhält x den Wert y, noch bevor es deklariert und initialisiert wird? Derselbe Fehler bei der Kompilierung, wie es bei Instanzfeldern der Fall war.

+0

definieren „vor“. Da sie statisch sind, muss MyClass1 nicht instanziiert werden, um x und y zu verwenden. In diesem Fall wäre also "vorher" nur vorhanden, bevor Sie sie zur Klasse hinzugefügt haben. – TigOldBitties

+0

Konnte dir nicht ganz folgen. Ich weiß, dass sowohl x als auch y statische Felder sind. Die Initialisierung erfolgt für statische Felder durch statischen Konstruktor, wenn wir versuchen, zum ersten Mal (in diesem Fall) auf ein statisches Feld oder eine statische Methode für einen Typ zuzugreifen. Wenn es passiert, glaube ich, dass y verfügbar sein sollte, wenn x initialisiert wird, aber y in der nächsten Zeile gefunden wird, was problematisch ist. – RBT

Antwort

3

Von ECMA-334 - 17.4.5.1 Static Feldinitialisierung

statischen Feld Variableninitialisierungen einer Klassendeklaration entsprechen einer Folge von Aufgaben, die in der ausgeführt werden Textfolge, in der sie in der Klassendeklaration erscheinen. Wenn ein statischer Konstruktor (§17.11) in der Klasse vorhanden ist, erfolgt die Ausführung der statischen Feldinitialisierer unmittelbar vor dem Ausführen des statischen Konstruktors . Andernfalls werden die Initiatoren des statischen Feldes zu einer implementierungsabhängigen Zeit vor der ersten Verwendung von einem statischen Feld dieser Klasse ausgeführt.

So y Variable wird in der Linie der Initialisierung von x Variable verwendet und mit Standardwert initialisiert, die 0 ist

0

Sie werden in der Reihenfolge initialisiert. Zuerst wird x auf den Wert y gesetzt, der 0 (Standard) ist. Dann wird auf y 10.

Verwandte Themen