Dieser Code hat das gut definierte Verhalten in C # nicht funktioniert:
%Vor%Hinweis: Ich frage nicht, wie ich diesen Code reparieren kann als Ich wusste schon, wie man das macht
Was ist die Begründung dafür? C # führt bereits Zeitüberprüfungen durch, um den ersten Zugriff auf statische Member zu erkennen. Warum erweitern Sie das nicht auf ein Pro-Element-Objekt und lassen es bei Bedarf laufen, oder besser gesagt, der Compiler ermittelt die Reihenfolge zur Kompilierzeit?
BTW: Ich denke, die gleiche Frage (oder fast die gleiche) gilt auch für nicht statische Mitglieder.
Ich kann einen Programmierer aufgrund von Nebeneffekten mit anderen statischen Klassen von der Initialisierungsreihenfolge abhängig machen. Sie und ich beide wissen, dass abhängig von Nebenwirkungen schlechte Praxis ist, aber es ist nicht unbedingt illegal.
Betrachten Sie etwas wie folgt:
%Vor% Und Bar.GetVersion
setzt voraus, dass Bar.GetHeader
aufgerufen wurde. Wenn der Compiler frei wäre, die Initialisierungsreihenfolge zu ändern, wäre der Programmierer nicht in der Lage, die Initialisierungsreihenfolge zu garantieren.
Hässlich, gewährt, aber vollkommen legal. Wenn man sich Effekte zweiten Grades vorstellt (dh statische Methoden genannt werden, die wiederum von Klassen mit Nebeneffekten abhängen), sieht man, dass der Compiler nichts verlässlich neu anordnen kann, ebenso wie es für den Compiler im Allgemeinen unmöglich ist, den Code neu anzuordnen Reihenfolge der Funktionsaufrufe in Ihrem statischen Konstruktor.
Initialisierer sind nur ein syntaktischer Zucker. Der Compiler fügt diesen Code in die .cctor-Datei ein, wenn er Ihre Klasse kompiliert, und pusht sie in der Reihenfolge, in der sie im Code angeordnet sind.
Es führt keine Überprüfungen durch, weil es keinen Sinn ergibt. Sie könnten immer noch Initialisierungszyklen haben, also würde es sowieso nicht funktionieren.
Ich habe vor einiger Zeit darüber gebloggt, wenn Sie interessiert sind:
C # überprüft die Laufzeit, um den ersten Zugriff auf eine Klasse zu erkennen, ordnet jedoch die statische Initialisierung in einer Klasse nicht neu an.
Die statischen Felder werden von oben nach unten initialisiert, gefolgt von den statischen Konstruktoren von oben nach unten. Ändern Sie entweder die Reihenfolge Ihrer Felder oder erstellen Sie einen statischen Konstruktor und initialisieren Sie die Felder von tehre.
Siehe Variableninitialisierer in der C # -Spezifikation oder dieser Artikel zu Initialisierungen. Auch die Frage Die Reihenfolge der statischen Konstruktoren / Initialisierer in C # steht in Beziehung.
Tags und Links c# design language-theory