Wenn ich eine Klasse habe, die einen statischen Konstruktor enthält, wird dieser Konstruktor aufgerufen, wenn die Assembly, die die Klasse enthält, zum ersten Mal geladen wird oder wenn der erste Verweis auf diese Klasse getroffen wird?
86
A static constructor is used to initialize any static data
NEIN. Besser zumstatic initializer
Initialisieren statischer Daten.Es ist nicht ganz so einfach, wie Sie es trotz einfacher Dokumentation erwarten würden. Jon Skeets Artikel http://csharpindepth.com/Articles/General/Beforefieldinit.aspx geht ausführlich auf diese Frage ein.
Zusammenfassung:
Der statische Konstruktor wird garantiert unmittelbar vor dem ersten Verweis auf ein Mitglied dieser Klasse ausgeführt - entweder die Erstellung einer Instanz oder eine eigene statische Methode / Eigenschaft der Klasse.
Beachten Sie, dass statische Initilizer (wenn kein statischer Konstruktor vorhanden ist) garantiert jederzeit ausgeführt werden können, bevor zuerst auf ein bestimmtes Feld verwiesen wird.
quelle
Der statische Konstruktor wird aufgerufen, bevor Sie etwas in der Klasse verwenden. Wann genau dies geschieht, hängt jedoch von der Implementierung ab.
Es wird garantiert aufgerufen, bevor auf das erste statische Mitglied zugegriffen wird und bevor die erste Instanz erstellt wird. Wenn die Klasse nie verwendet wird, kann nicht garantiert werden, dass der statische Konstruktor überhaupt aufgerufen wird.
quelle
Wenn die statische Methode von der übergeordneten Klasse aufgerufen wird, wird der statische Konstruktor nicht aufgerufen, obwohl er explizit angegeben ist. Hier ist ein Beispiel. Der Konstruktor b wird nicht aufgerufen, wenn b.methoda () aufgerufen wird.
quelle
Es scheint eine Gotcha mit statischen Konstruktoren zu geben, die an anderer Stelle beantwortet wird, aber eine Weile gebraucht hat, um eine einfache Erklärung zu finden. In allen Dokumenten und Erklärungen wird behauptet, dass die Ausführung des statischen Konstruktors / der Initialisierer "garantiert" ist, bevor die erste Klasse instanziiert oder auf das erste statische Feld verwiesen wird. Das Gotcha kommt herein, wenn Sie versuchen, einen statischen Singleton in die Klasse einzufügen, der eine Instanz von sich selbst erstellt (Huhn / Ei). In diesem Fall wird der statische Konstruktor nach dem Instanzkonstruktor aufgerufen - und in meinem Fall enthielt der Instanzkonstruktor Code, der auf einigen statischen Daten beruhte.
Statischer Konstruktor nach Instanzkonstruktor aufgerufen?
Der statische Konstruktor kann nach dem nicht statischen Konstruktor ausgeführt werden. Ist das ein Compiler-Fehler?
(Die Antwort für mich war, den Singleton in eine separate Klasse zu stellen oder die statischen Daten im Instanzkonstruktor manuell zu initialisieren, bevor sie benötigt werden.)
quelle