Wenn ich eine Klasse mit einem statischen Konstruktor habe, wird dieser Konstruktor aufgerufen, wenn die Assembly, die die Klasse enthält, zuerst geladen wird oder wenn die erste Referenz auf diese Klasse gefunden wird?Wann wird ein statischer Konstruktor in C# aufgerufen?
Antwort
Wenn die Klasse zum ersten Mal zugegriffen wird.
Static Constructors (C# Programming Guide)
ist ein statischer Konstruktor verwendet, um alle statischen Daten zu initialisieren, oder eine bestimmte Aktion durchzuführen, die nur einmal ausgeführt werden muss. Es wird automatisch aufgerufen, bevor die erste Instanz erstellt wird oder auf statische Elemente verwiesen wird.
Es ist nicht ganz so einfach, wie Sie trotz der einfachen Dokumentation erwarten können. Jon Skeets Artikel http://csharpindepth.com/Articles/General/Beforefieldinit.aspx geht auf diese Frage im Detail ein.
Zusammenfassung:
Statische Konstruktor wird garantiert sofort an ein Mitglied dieser Klasse vor der ersten Referenz ausgeführt werden - entweder Schaffung Instanz oder eigener statischer Methode/Eigenschaft der Klasse.
Beachten Sie, dass statische Initiatoren (wenn es keinen statischen Konstruktor gibt) garantiert ausgeführt werden jederzeit vor dem ersten Verweis auf bestimmte Feld.
+1. Beat mich dazu, nur gerade so. ;) – AnthonyWJones
Das ist eine sehr interessante Lektüre, danke Herren. – Jason
Der erwähnte Artikel ist jetzt auf Jon Skeet Website: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy
Der statische Konstruktor aufgerufen wird, bevor Sie etwas in der Klasse verwenden, aber wann genau das ist passiert mit der Umsetzung auf.
Es ist garantiert, bevor das erste statische Element aufgerufen werden, zugegriffen wird und bevor die erste Instanz erstellt wird. Wenn die Klasse nie verwendet wird, wird nicht garantiert, dass der statische Konstruktor überhaupt aufgerufen wird.
Wenn es passiert * ist nicht "bis zur Implementierung", wenn diese Implementierung der ECMA C# Spezifikation folgt: "Die Ausführung eines statischen Konstruktors wird durch das erste der folgenden Ereignisse innerhalb einer Anwendungsdomäne ausgelöst: [1] An Instanz der Klasse wird erstellt. [2] Auf alle statischen Member der Klasse wird verwiesen. " (Abschnitt 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH
@Luke: "Das genaue Timing der statischen Konstruktorausführung ist implementierungsabhängig" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa
@Guffa: Das könnte die Interpretation des Artikelautors sein, aber Sie werden diese Formulierung in den Microsoft- oder ECMA/ISO-Versionen der C# -Spezifikation nicht finden. – LukeH
Bei statischer Methode von Elternklasse aufgerufen wird, wird statischer Konstruktor nicht aufgerufen werden, althogh es explizit angegeben wird. Hier ist ein Beispiel b Konstruktor wird nicht aufgerufen, wenn b.methoda() aufgerufen wird.
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
- 1. Wann wird ein Managed Bean-Konstruktor aufgerufen?
- 2. Wann wird der SignalR-Hub-Konstruktor aufgerufen?
- 3. Wann wird ein Kopierkonstruktor in cpp aufgerufen?
- 4. Statischer Konstruktor, der zweimal für PerSession WCF-Dienst aufgerufen wird
- 5. Child statischer Konstruktor nicht aufgerufen, wenn Basiselement
- 6. Typinitialisierung (statischer Konstruktor) Ausnahmebehandlung
- 7. Wann wird Move Constructor aufgerufen?
- 8. Öffentlicher Konstruktor und statischer Konstruktor
- 9. C++ default Konstruktor wird nicht aufgerufen
- 10. Wann wird Control.DestroyHandle aufgerufen?
- 11. Objective-C Klassenvariablen: Wann wird Dealloc aufgerufen?
- 12. Wann wird InitWithCoder aufgerufen?
- 13. C++ Template-Konstruktor, warum wird der Copy-Konstruktor aufgerufen?
- 14. Wann wird document.ready() aufgerufen?
- 15. Wann wird onSizeChanged() aufgerufen?
- 16. Wann wird 'drawRect' aufgerufen?
- 17. Wann wird onRestoreInstanceState aufgerufen?
- 18. Statischer Konstruktor & Singleton-Klasse
- 19. Wann wird DbConnection.StateChange aufgerufen?
- 20. Wann wird ein Körper onLoad aufgerufen?
- 21. So stellen Sie sicher, dass ein statischer Konstruktor ohne Aufruf eines Mitglieds aufgerufen wird
- 22. Statischer Konstruktor und Ausnahmen
- 23. Wann wird ServiceConnection.onServiceDisconnected() aufgerufen?
- 24. Welcher Konstruktor wird hier aufgerufen?
- 25. Statischer Konstruktor in Javascript ES6
- 26. C# Instance Constructor vs Statischer Konstruktor
- 27. C++/CLI, statischer Konstruktor außerhalb der Klassendeklaration
- 28. ISerialization-Konstruktor wird nicht aufgerufen
- 29. MainWindow-Konstruktor wird zweimal aufgerufen
- 30. SQLiteOpenHelper-Konstruktor wird nicht aufgerufen
Danke, das macht Sinn, wenn ich richtig darüber nachdenke! – Jason
Interessant, dass es heißt "bevor die erste Instanz erstellt wird oder auf statische Elemente verwiesen wird". Es gibt einen gewissen Spielraum in * wenn * es tatsächlich aufgerufen wird. –
@TimBarrass aufgrund einiger anderen Anforderungen der Spezifikation stellt sich heraus, dass „vor“ ist eigentlich „unmittelbar vor“ - Jon Skeet-Artikel in anderer Antwort verwiesen - http://stackoverflow.com/a/1437372/477420 –