2009-09-17 11 views

Antwort

79

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.

+0

Danke, das macht Sinn, wenn ich richtig darüber nachdenke! – Jason

+5

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. –

+5

@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 –

34

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.

+0

+1. Beat mich dazu, nur gerade so. ;) – AnthonyWJones

+0

Das ist eine sehr interessante Lektüre, danke Herren. – Jason

+0

Der erwähnte Artikel ist jetzt auf Jon Skeet Website: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy

17

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.

+2

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

+0

@Luke: "Das genaue Timing der statischen Konstruktorausführung ist implementierungsabhängig" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa

+2

@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

0

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 
    } 
}  
Verwandte Themen