2009-09-17 11 views
69

Quando ho una classe contenente un costruttore statico, viene chiamato il costruttore quando viene caricato per la prima volta l'assembly che contiene la classe o quando viene colpito il primo riferimento a quella classe?Quando è un costruttore statico chiamato in C#?

risposta

79

Quando si accede alla classe per la prima volta.

Static Constructors (C# Programming Guide)

Un costruttore statico viene utilizzato per inizializzare i dati statici, o per eseguire una particolare azione che deve eseguita una sola volta. Viene chiamato automaticamente prima della creazione della prima istanza o di riferimenti a membri statici.

+0

Grazie, ha senso quando ci penso bene! – Jason

+5

Interessante che dice "prima che venga creata la prima istanza o che venga fatto riferimento a qualsiasi membro statico". C'è un margine di manovra in * quando * viene effettivamente invocato. –

+5

@TimBarrass a causa di alcuni altri requisiti delle specifiche risulta che "before" è in realtà "immediatamente precedente" - vedi l'articolo di Jon Skeet cui fa riferimento un'altra risposta: http://stackoverflow.com/a/1437372/477420 –

34

Non è così semplice come ci si potrebbe aspettare nonostante la documentazione semplice. L'articolo di Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx affronta questa domanda in dettaglio.

Sommario:

costruttore statico è garantito essere eseguito immediatamente prima del primo riferimento ad un membro di quella classe - o creazione dell'istanza o proprio metodo statico/proprietà di classe.

Si noti che initilaizers statici (se non esiste un costruttore statico) sono garantiti per l'esecuzione in qualsiasi momento prima del primo riferimento a un campo particolare.

+0

+1. Picchiami, solo solo se. ;) – AnthonyWJones

+0

Questa è una lettura molto interessante, grazie signori. – Jason

+0

L'articolo citato è ora sul sito di Jon Skeet: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy

17

Il costruttore statico viene chiamato prima di utilizzare qualsiasi cosa nella classe, ma esattamente quando ciò accade dipende dall'implementazione.

È garantito il richiamo prima che venga effettuato l'accesso al primo membro statico e prima che venga creata la prima istanza. Se la classe non viene mai utilizzata, non è garantito che il costruttore statico venga chiamato.

+2

Quando succede * non è * "fino all'implementazione" se tale implementazione segue la specifica CMA ECMA: "L'esecuzione di un costruttore statico viene attivata dal primo degli eventi seguenti che si verificano all'interno di un dominio dell'applicazione: [1] An viene creata l'istanza della classe. [2] Qualsiasi membro statico della classe è referenziato. " (Sezione 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH

+0

@Luke: "Il momento esatto dell'esecuzione del costruttore statico dipende dall'implementazione" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa

+2

@Guffa: potrebbe essere l'interpretazione dell'autore dell'articolo, ma non troverai questa dicitura nelle versioni Microsoft o ECMA/ISO delle specifiche C#. – LukeH

0

Nel caso in cui il metodo statico venga chiamato dalla classe padre, il costruttore statico non verrà chiamato, anche se è esplicitamente specificato. Ecco un costruttore di esempio b non chiamato se b.methoda() è chiamato.

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

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

class b : a 
{ 
    static b() 
    { 
     //some initialization 
    } 
}  
Problemi correlati