Ich habe ein paar Recherchen angestellt und ich denke, der folgende Code ist garantiert, um Ausgaben zu produzieren:
B.X = 7
B.X = 0
A.X = 1
A = 1, B = 0
static class B
{
public static int X = 7;
static B() {
Console.WriteLine("B.X = " + X);
X = A.X;
Console.WriteLine("B.X = " + X);
}
}
static class A
{
public static int X = B.X + 1;
static A() {
Console.WriteLine("A.X = " + X);
}
}
static class Program
{
static void Main() {
Console.WriteLine("A = {0}, B = {1}", A.X, B.X);
}
}
Ich habe dies zahlreiche Male ausgeführt und bekomme immer die Ausgabe über dem Codebereich; Ich wollte nur überprüfen, wird sich das ändern? Auch wenn textuell Klasse A
und Klasse B
neu angeordnet sind?
Wird garantiert, dass die erste Verwendung eines statischen Objekts die Initialisierung seiner statischen Member auslösen wird, gefolgt von der Instanziierung seines statischen Konstruktors? Für dieses Programm wird durch die Verwendung von A.X
in main die Initialisierung von A.X
ausgelöst, was wiederum B.X
initialisiert, dann B()
und nach Abschluss der Initialisierung von A.X
wird mit A()
fortgefahren. Schließlich wird Main()
A.X
und B.X ausgeben.
1 Stimmen
Wenn Main() zuerst B.X verwendet hätte, wären die Ausgabewerte 7, 8, 8, A = 8, B = 8.
2 Stimmen
Für den spezifischen Code aus Ihrer Frage ist die Antwort von Porges genau richtig. Für die allgemeinere Frage aus Ihrem Titel - "Ist die Reihenfolge der statischen Klasseninitialisierung in C# deterministisch?" - lautet die Antwort, dass es darauf ankommt: Wenn die beteiligten statischen Typen alle statische Konstruktoren haben, ist die Initialisierungsreihenfolge bestimmt; wenn nicht, dann nicht.
0 Stimmen
Verwandte: stackoverflow.com/questions/1494735/…