Quando è un costruttore statico chiamato in C #?

Quando ho una class contenente un costruttore statico, viene chiamato quel costruttore quando l’assembly che contiene la class viene caricato per la prima volta o quando viene colpito il primo riferimento a quella class?

Quando si accede alla class per la prima volta.

Static Constructors (C # Programming Guide)

Un costruttore statico viene utilizzato per inizializzare qualsiasi dato statico o per eseguire un’azione particolare che deve essere eseguita una sola volta. Viene chiamato automaticamente prima della creazione della prima istanza o di riferimenti a membri statici.

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

Sommario:

È garantito che il costruttore statico venga eseguito immediatamente prima del primo riferimento a un membro di quella class, ovvero la creazione dell’istanza o il proprio metodo statico / proprietà della class.

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.

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

È garantito che venga chiamato prima che il primo membro statico sia acceduto e prima che venga creata la prima istanza. Se la class non viene mai utilizzata, non è garantito che il costruttore statico venga chiamato.

Nel caso in cui il metodo statico venga chiamato dalla class genitore, 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 } } 

Sembra esserci un trucchetto con costruttori statici a cui è stata data una risposta altrove, ma ci è voluto un po ‘per digerire una semplice spiegazione. Tutti i documenti e le spiegazioni sostengono che il costruttore statico / gli intializzatori sono “garantiti” per l’esecuzione prima che la prima class sia istanziata o che venga fatto riferimento al primo campo statico. Il gotcha arriva quando provi a mettere un singleton statico nella class che crea un’istanza di se stesso (pollo / uovo). In questo caso, il costruttore statico viene chiamato dopo il costruttore dell’istanza, e nel mio caso il costruttore dell’istanza conteneva il codice che si basava su alcuni dati statici.

Costruttore statico chiamato dopo il costruttore di istanze?

Il costruttore statico può essere eseguito dopo il costruttore non statico. È un bug del compilatore?

(la risposta per me era mettere il singleton in una class separata o inizializzare manualmente i dati statici nel costruttore dell’istanza prima che sia necessario)