2013-12-08 14 views
21

Ho notato che una classe non statico può avere un costruttore statico:Qual è la funzione di un costruttore statico in una classe non statica?

public class Thing 
{ 
    public Thing() 
    { 
     Console.WriteLine("non-static"); 
    } 

    static Thing() 
    { 
     Console.WriteLine("static"); 
    } 
} 

E quando si inizializza un'istanza Thing del costruttore statico viene chiamato prima.

uscita:

statico

non statico

Quale sarebbe il bisogno di questo? Lo usi per inizializzare i campi statici sull'istanza del tipo non statico?

Ci sono delle cose da tenere in considerazione quando si utilizza un costruttore statico?

+4

Rispondete voi stessi "per inizializzare i campi statici". Maggiori informazioni sul costruttore statico [qui] (http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx). –

risposta

23

Lo si utilizza per inizializzare i campi statici sull'istanza di tipo non statico?

Praticamente, tranne che i campi statici (o membri statici di qualsiasi tipo) non sono associati alle istanze; sono associati al tipo stesso, indipendentemente dal fatto che si tratti di una classe statica o di una classe non statica.

I documentation liste alcune proprietà di costruttori statici, uno dei quali è:

  • Un costruttore statico viene chiamato automaticamente per inizializzare la classe prima della prima istanza viene creato o eventuali membri statici vengono riferimento.

Qui, "prima" significa "immediatamente prima di", e qualsiasi una di quelle cose accade prima. Questo perché un costruttore statico viene chiamato una sola volta per tipo in una singola esecuzione del programma.


Ci sono delle cose da prendere in considerazione quando si utilizza un costruttore statico?

Ecco la lista completa, come dato dal link qui sopra, che dovrebbe dare un'idea di cosa aspettarsi quando si utilizza un costruttore statico:

  • Un costruttore statico non prende modificatori di accesso o avere parametri.

  • Un costruttore statico viene chiamato automaticamente per inizializzare la classe prima che venga creata la prima istanza o che venga fatto riferimento a qualsiasi membro statico.

  • Un costruttore statico non può essere chiamato direttamente.

  • L'utente non ha alcun controllo su quando il costruttore statico viene eseguito nel programma.

  • Un tipico utilizzo dei costruttori statici è quando la classe utilizza un file di registro e il costruttore viene utilizzato per scrivere le voci in questo file.

  • I costruttori statici sono anche utili quando si creano classi wrapper per codice non gestito, quando il costruttore può chiamare il metodo LoadLibrary.

  • Se un costruttore statico genera un'eccezione, il runtime non la invocherà una seconda volta e il tipo rimarrà non inizializzato per la durata del dominio dell'applicazione in cui è in esecuzione il programma.

Oltre a fare in modo che non si tenta di accedere ai membri non statici, dal momento che non sei in un costruttore di istanza, l'altra cosa principale che dovete considerare è che un costruttore statico viene sempre chiamato in un momento specifico durante l'esecuzione del programma. Come già detto, non puoi controllare questo, se non controllando quando "viene creata la prima istanza o viene fatto riferimento a qualsiasi membro statico."

1

Si utilizza per inizializzare o invocare membri statici della classe.

1

Questa è una risposta soggettiva per esperienza personale, ma è anche possibile utilizzarla per garantire l'inizializzazione di altre variabili statiche al di fuori della classe, da cui i membri della classe possono dipendere.

3

Da MSDN Link:

Un costruttore statico viene chiamato automaticamente per inizializzare la classe prima della prima istanza viene creata o qualsiasi membri statici sono raffrontate.

Come hai affermato, è utilizzato per inizializzare i campi statici. Devi solo considerare una cosa, i campi non statici non vengono inizializzati finché non crei un'istanza di classe.

0

Come indicato da BoltClock's a Unicorn precedente.

Ma una bella aggiunta è che si può utilizzare per implementare un Singleton bello e troppo facilmente:

public sealed class Singleton 
{ 
    private static readonly Singleton instance; 

    private Singleton() { } 

    static Singleton() 
    { 
     instance = new Singleton() 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
     return instance; 
     } 
    } 
} 

Maggiori dettagli possono essere trovati a http://www.codeproject.com/Articles/90896/Singletons-in-C-Static-Constructor-vs-Static-Initi

+0

Questo non sta utilizzando un costruttore statico ... – Servy

+0

Modificato per includere il codice e il collegamento corretti. Scuse. –

+0

Ma non c'è motivo di usare qui il costruttore statico; il tuo codice precedente è generalmente preferibile a questo, rendendo questa una scusa per usare un costruttore statico. – Servy

1
  • Statico costruttore viene chiamato automaticamente prima del primo l'istanza della classe è creata.
  • Dichiarato dal prefisso di una parola chiave statica alla definizione del costruttore.
  • Non può accettare modificatori di accesso o avere parametri.
Problemi correlati