2012-02-20 8 views
8

Mi sono imbattuto in un problema in cui ho bisogno di un'istanza della classe all'interno del suo costruttore statico. Ho creduto che non era possibile farlo così ho provato la seguente:È sicuro per una classe creare istanze di se stesso all'interno del costruttore statico?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(Foo.someString); 
     Console.ReadLine(); 
    } 
} 

class Foo 
{ 
    public static readonly string someString; 

    static Foo() 
    { 
     someString = new Foo().CreateString(); 
    } 

    private string CreateString() 
    { 
     return "some text"; 
    } 
} 

Con mia grande sorpresa, funziona - l'uscita è "un testo". Credevo che il costruttore statico debba essere eseguito e completato prima di poter creare istanze della classe. This answer mostra che questo non è necessariamente il caso. Questo significa che i costruttori statici e di istanze sono indipendenti l'uno dall'altro? E infine, è sicuro farlo (creare istanze nel costruttore statico)?

p.s. Ignoriamo il fatto che questo può essere evitato utilizzando un approccio diverso.

risposta

5

Tutto ciò che dice specification è che il costruttore statico verrà chiamato prima che venga creata qualsiasi istanza della classe. Ma non dice nulla circa il fatto che questo costruttore deve terminare:

Un costruttore statico viene utilizzato per inizializzare i dati statici, o per eseguire una particolare azione che deve essere eseguita una sola volta. Si chiama automaticamente prima che venga creata la prima istanza o si faccia riferimento a qualsiasi membro statico statico.

Si potrebbe perfettamente creare istanze della classe all'interno del costruttore statico e questo è sicuro.

+0

a seconda della definizione di sicurezza, l'ubicazione dell'istanza e l'utilizzo dell'istanza creata –

+0

@Rune FS: fare una cosa simile come nell'esempio: inizializzare una variabile membro statica – loodakrawa

+0

Fare attenzione quando i costruttori statici dipendono da altri costruttori statici. Cerca di non ottenere una dipendenza circolare, perché ciò può causare l'accesso ai membri e creare istanze della classe prima che l'inizializzatore statico abbia completato l'esecuzione. Il Framework non ti avviserà per questo (cioè, nessuna eccezione o deadlock). – Ruben

0

Il costruttore statico viene chiamato automaticamente prima che venga creata la prima istanza o a qualsiasi membro statico venga fatto riferimento a qualsiasi riferimento a campi statici. Quindi quando è stata eseguita l'applicazione e si è effettuato l'accesso a Foo, il costruttore statico è stato eseguito e la stringa è stata inizializzata.

È sicuro?: Come tale non c'è nulla di male nel fare ciò. È solo che vengono eseguiti solo una volta.

Per informazioni su questo letto Static Classes and Static Class Members on MSDN

+0

, si prega di fornire un motivo. –

+0

Prima di tutto, i costruttori statici sono chiamati al primo accesso al tipo (membri), non quando l'assembly che contiene il tipo viene caricato. In secondo luogo, quando il costruttore statico viene chiamato sopra viene creata un'istanza che è ciò che l'OP sta chiedendo di essere sicuro o meno. Quindi, anche se l'istruzione su quando viene chiamato il costruttore cambia quell'OP in istanza in quel particolare momento –

+0

Non so chi sia il downvoter, ma la tua affermazione "Il costruttore statico viene chiamato quando l'applicazione viene caricata nella memoria." non è vero. – Mentoliptus

0

E 'sicuro come sarà chiamato solo una volta.

Problemi correlati