Warum wird in C # die statische Initialisierung angefordert?

8

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.

    
BCS 18.03.2009, 21:29
quelle

4 Antworten

6

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.

    
Jim Mischel 19.03.2009, 00:23
quelle
12

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:

Krzysztof Kozmic 18.03.2009 21:43
quelle
1

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.

    
James Schek 18.03.2009 21:34
quelle
1

Ich denke, was Sie brauchen, ist ein statischer Konstruktor.

Wie so

%Vor%

Warum C # es nicht beim ersten Zugriff tut, sehe ich nicht die Notwendigkeit für diese Art von Komplexität, wenn es andere Alternativen gibt, die klar machen, was passiert.

    
Ray 18.03.2009 21:33
quelle

Tags und Links