El código incluye una instancia inicializado estática privada:
private static Foo instance = new Foo();
Tiene pensado que esto significa que la instancia constructor siempre tendrá correr antes de acceder a cualquier método estático, por lo tanto, asegurar bar
se ha inicializado?
En el caso de un solo subproceso, creo que tienes razón.
La secuencia de eventos sería:
- llamada a
Foo.BarLength()
- inicialización estática de la clase
Foo
(si no se ha completado)
- inicialización estática del miembro estático privada
instance
con instancia de Foo
- entrada a
Foo.BarLength()
Sin embargo, la inicialización estática de una clase es sólo alguna vez desencadena una vez por aplicación de dominio - y IIRC no hay bloqueo para asegurarse de que es completaron antes se llaman otros métodos estáticos.
Por lo tanto, usted podría tener este escenario:
- Tema Alfa: Llamada a
Foo.BarLength()
- Tema Alfa: inicialización estática de la clase
Foo
(si no se ha completado) comienza
- cambio de contexto
- Subproceso Beta: llame al
Foo.BarLength()
- Subproceso Beta: No Llamar de inicialización estática de la clase
Foo
porque eso es ya en marcha
- rosca Beta: Entrada a
Foo.BarLength()
- rosca Beta: El acceso a
null
miembro estático instance
No hay manera de que el analizador contratos puede saber que nunca ejecutarías el código de manera multiproceso, por lo que tiene que pecar de cauteloso.
De tema, pero me podría decir qué tema de Visual Studio que está utilizando? – Justin
@Justin: simplemente el tema predeterminado vs2010 con mi propio esquema de color de texto personalizado (ver publicación editada). ¿Porque lo preguntas? – dtb
Acabo de estar buscando cambiar mi propio esquema de colores de estudio visual últimamente y realmente me gusta. Me preguntaba si lo habías descargado en alguna parte. – Justin