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
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.
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.
+1. Picchiami, solo solo se. ;) – AnthonyWJones
Questa è una lettura molto interessante, grazie signori. – Jason
L'articolo citato è ora sul sito di Jon Skeet: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy
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.
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
@Luke: "Il momento esatto dell'esecuzione del costruttore statico dipende dall'implementazione" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa
@Guffa: potrebbe essere l'interpretazione dell'autore dell'articolo, ma non troverai questa dicitura nelle versioni Microsoft o ECMA/ISO delle specifiche C#. – LukeH
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
}
}
- 1. Costruttore statico chiamato dopo il costruttore di istanze?
- 2. Costruttore statico in VB.NET
- 3. C# statico generico costruttore
- 4. Equivalente costruttore statico in Objective-C?
- 5. Come fa C# a sapere quando eseguire un costruttore statico?
- 6. Condizioni di gara nel costruttore statico C#
- 7. È un blocco statico Java equivalente a un costruttore statico C#?
- 8. Il costruttore statico può essere eseguito dopo il costruttore non statico. È un bug del compilatore?
- 9. C'è un costruttore statico o un inizializzatore statico in Python?
- 10. Quando viene chiamato il costruttore in java?
- 11. Costruttore pubblico e costruttore statico
- 12. Quando il costruttore di movimento viene chiamato
- 13. Come funziona un costruttore statico?
- 14. È possibile sovrascrivere un costruttore in C#?
- 15. Eccezione nel costruttore statico
- 16. shared_from_this chiamato dal costruttore
- 17. Popolare un contenitore membro statico in C++
- 18. Tipo inizializzatore (costruttore statico) gestione delle eccezioni
- 19. Perché il costruttore statico della classe genitore non viene chiamato quando si richiama un metodo su una classe nidificata?
- 20. Cosa succede quando si chiama un metodo statico in C#?
- 21. Qual è la funzione di un costruttore statico in una classe non statica?
- 22. Perché il costruttore statico non ha chiamato prima il primo metodo di chiamata allo
- 23. Come assicurarsi che un costruttore statico venga chiamato senza chiamare alcun membro
- 24. Passare argomenti a un costruttore statico in Java?
- 25. Costruttore statico per l'intero assieme
- 26. Quando viene chiamato il costruttore di hub SignalR?
- 27. Quando è OnValidate chiamato in Linq?
- 28. Android quando è onLocationChanged chiamato
- 29. UICollectionViewLayout quando è layoutAttributesForItemAtIndexPath chiamato
- 30. inizializzatore di campo statico readon vs inizializzazione del costruttore statico
Grazie, ha senso quando ci penso bene! – Jason
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. –
@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 –