Quando ho una classe contenente un costruttore statico, quel costruttore viene chiamato quando l'assembly contenente la classe viene caricato per la prima volta o quando viene raggiunto il primo riferimento a quella classe?
Risposte:
Quando si accede alla classe per la prima volta.
Costruttori statici (Guida per programmatori C #)
Un costruttore statico viene utilizzato per inizializzare i dati statici o per eseguire un'azione particolare che deve essere eseguita una sola volta. Viene chiamato automaticamente prima della creazione della prima istanza o prima di fare riferimento a qualsiasi membro statico.
A static constructor is used to initialize any static data
NO. Meglio da usare static initializer
per inizializzare cose statiche.
Non è così semplice come ci si potrebbe aspettare nonostante la documentazione diretta. 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 classe: creazione dell'istanza o metodo / proprietà statica della classe.
Si noti che gli inizializzatori statici (se non esiste un costruttore statico) garantiscono l'esecuzione in qualsiasi momento prima del primo riferimento a un campo particolare.
Il costruttore statico viene chiamato prima di usare qualsiasi cosa nella classe, ma esattamente quando ciò accade dipende dall'implementazione.
È garantito che venga chiamato prima dell'accesso al primo membro statico e prima della creazione della prima istanza. Se la classe non viene mai utilizzata, non è affatto garantito che il costruttore statico venga chiamato.
Nel caso in cui il metodo statico venga chiamato dalla classe genitore, il costruttore statico non verrà chiamato, anche se è esplicitamente specificato. Ecco un esempio b.Il costruttore non viene chiamato se viene chiamato 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
}
}
Sembra che ci sia un problema con i costruttori statici a cui è stata data risposta altrove, ma ci è voluto un po 'per digerire in una semplice spiegazione. Tutti i documenti e le spiegazioni affermano che il costruttore / inizializzatore statico è "garantito" per essere eseguito prima che venga creata un'istanza della prima classe o venga fatto riferimento al primo campo statico. Il gotcha arriva quando si tenta di inserire un singleton statico nella classe che crea un'istanza di se stesso (pollo / uovo). In questo caso il costruttore statico finisce per essere chiamato dopo il costruttore dell'istanza, e nel mio caso il costruttore dell'istanza conteneva codice che si basava su alcuni dati statici.
Costruttore statico chiamato dopo il costruttore di istanze?
(la risposta per me era mettere il singleton in una classe separata o inizializzare manualmente i dati statici nel costruttore dell'istanza prima che fosse richiesto)