Il codice include un'istanza privata statica inizializzata:
private static Foo instance = new Foo();
Stai assumendo che questo significa l'istanza costruttore avrà sempre eseguito prima che l'accesso a qualsiasi metodo statico, quindi, garantendo bar
è stato inizializzato?
Nel caso a thread singolo, penso che tu abbia ragione.
La sequenza degli eventi sarebbe:
- Chiama per
Foo.BarLength()
- inizializzazione statico della classe
Foo
(se non è già completato)
- inizializzazione statico di membro statico privato
instance
con istanza di Foo
- Immissione a
Foo.BarLength()
Tuttavia, l'inizializzazione statica di una classe viene attivata solo una volta per dominio App e IIRC non prevede alcun blocco per garantire che sia completato prima di chiamare qualsiasi altro metodo statico.
Quindi, si potrebbe avere questo scenario:
- Alpha Discussione: Call to
Foo.BarLength()
- Discussione Alpha: l'inizializzazione statico della classe
Foo
(se non è già completato) inizia
- Context switch
- Thread Beta: Chiama a
Foo.BarLength()
- Beta: No Call di inizializzazione statico della classe
Foo
perché è già in corso
- Discussione Beta: Entrata al
Foo.BarLength()
- Beta Discussione: L'accesso a
null
membro statico instance
Non c'è modo l'analizzatore contratti possono sapere che non avresti mai eseguito il codice in un modo multithread, quindi deve errare sul lato della cautela.
fuori tema, ma potreste dirmi cosa Visual Studio tema che si sta utilizzando? – Justin
@Justin: solo il tema predefinito vs2010 con la mia combinazione di colori di testo personalizzata (vedi post modificato). Perché stai chiedendo? – dtb
Ho appena cercato di cambiare i miei schemi di colori dello studio visivo ultimamente e mi piace molto. Mi stavo chiedendo se lo avessi scaricato da qualche parte. – Justin