2009-09-17 8 views

Odpowiedz

79

Kiedy klasa jest dostępna po raz pierwszy.

Static Constructors (C# Programming Guide)

Statyczny konstruktor służy do zainicjowania żadnych danych statycznych, lub do wykonywania określonych czynności, które musi wykonać tylko jeden raz. Jest wywoływana automatycznie przed utworzeniem pierwszej instancji lub odniesieniem do jakichkolwiek statycznych elementów.

+0

Dzięki, że ma to sens, kiedy myślę o tym poprawnie! – Jason

+5

Ciekawe, że mówi "przed utworzeniem pierwszej instancji lub z jakimikolwiek statycznymi elementami członkowskimi". Istnieje pewna swoboda w *, gdy * faktycznie zostanie wywołana. –

+5

@TimBarrass ze względu na inne wymagania specyfikacji okazuje się, że "przed" jest faktycznie "bezpośrednio przed" - zobacz artykuł Jona Skeeta wymieniony w innej odpowiedzi - http://stackoverflow.com/a/1437372/477420 –

34

To nie jest tak proste, jak można by się spodziewać pomimo prostej dokumentacji. Artykuł Jona Skeeta nr http://csharpindepth.com/Articles/General/Beforefieldinit.aspx zawiera szczegółowe informacje na ten temat.

Podsumowanie:

Statyczny konstruktor gwarantowana jest do wykonania natychmiast przed pierwszym odniesieniu do członka tej klasy - bądź tworzenia instancji lub własnej statycznej metody/właściwości klasy.

Należy zauważyć, że inicjatory statyczne (jeśli nie ma konstruktora statycznego) gwarantowane do wykonania w dowolnym momencie przed pierwszym odnośnikiem do określonego pola.

+0

+1. Pokonaj mnie, ale tylko tak. ;) – AnthonyWJones

+0

To bardzo ciekawa lektura, dziękuję panów. – Jason

+0

Wymieniony artykuł jest teraz na stronie Jona Skeeta: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy

17

Konstruktor statyczny jest wywoływany przed użyciem czegokolwiek w klasie, ale dokładnie wtedy, gdy tak się dzieje, jest do wdrożenia.

Gwarantuje to wywołanie przed uzyskaniem dostępu do pierwszego elementu statycznego i przed utworzeniem pierwszej instancji. Jeśli klasa nigdy nie jest używana, konstruktor statyczny nie może być w ogóle wywołany.

+2

Kiedy to się dzieje * nie jest * "aż do implementacji", jeśli implementacja jest zgodna ze specyfikacją ECMA C#: "Wykonanie statycznego konstruktora jest wyzwalane przez pierwsze z następujących zdarzeń, które mają wystąpić w domenie aplikacji: [1] powstaje instancja klasy. [2] Dowolny ze statycznych elementów klasy jest przywoływany. " (Sekcja 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH

+0

@Luke: "Dokładny czas wykonywania statycznego konstruktora zależy od implementacji" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa

+2

@Guffa: To może być interpretacja autora artykułu, ale nie znajdziesz tego w wersji Microsoft lub ECMA/ISO specyfikacji C#. – LukeH

0

W przypadku wywołania metody statycznej z klasy nadrzędnej, konstruktor statyczny nie zostanie wywołany, ale jest jawnie określony. Oto przykładowy konstruktor b nie jest wywoływany, jeśli wywołana jest metoda b.methoda().

static void Main(string[] args) 
{ 
    b.methoda(); 
} 

class a 
{ 
    public static void methoda() 
    { 
     //using initialized method data 
    } 
} 

class b : a 
{ 
    static b() 
    { 
     //some initialization 
    } 
}  
Powiązane problemy