¿Qué hace la bandera beforefieldinit? Cuando miro el IL de mi clase, veo esta bandera, pero no sé qué está haciendo realmente esta bandera.
Vea mi artículo sobre este mismo tema.
Básicamente, beforefieldinit
significa que "el tipo se puede inicializar en cualquier punto antes de que se haga referencia a cualquier campo estático". En teoría, eso significa que puede inicializarse de forma muy perezosa : si llama a un método estático que no toca ningún campo, el JIT no necesita inicializar el tipo.
En la práctica , significa que la clase se inicializa antes de lo que sería de otra manera; está bien que se inicialice al comienzo del primer método que podría usarla. Compare esto con los tipos que no se les han beforefieldinit
aplicado, donde la inicialización del tipo debe ocurrir inmediatamente antes del primer uso real .
Entonces, supongamos que tenemos:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Si ambos tipos se beforefieldinit
les han aplicado (lo que en C # lo hacen de forma predeterminada a menos que el tipo tenga un constructor estático), ambos se inicializarán al comienzo del DoSomething
método (por lo general, no está garantizado). Si no lo tienen beforefieldinit
, solo se inicializará uno de ellos, según la bandera.
Por eso es común usar un constructor estático (¡incluso uno vacío!) Al implementar el patrón singleton .
Parece que va a cambiar en 4.6
https://github.com/dotnet/coreclr/issues/1193
fuente
beforefieldinit
o no)?