Pregunta

¿Qué hace la bandera beforefieldinit? Cuando veo el IL de mi clase, veo esta bandera, pero no sé qué está haciendo realmente esta bandera.

¿Fue útil?

Solución

Consulte mi artículo sobre este mismo tema.

Básicamente, beforefieldinit significa que el tipo se puede inicializar en cualquier momento antes de que se haga referencia a cualquier campo estático. " En teoría , eso significa que puede ser muy perezosamente inicializado: 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 usarlo. Compare esto con los tipos que no tienen aplicado beforefieldinit , donde la inicialización del tipo tiene que ocurrir inmediatamente antes del primer uso de actual .

Entonces, supongamos que tenemos:

public static void DoSomething(bool which)
{
    if (which)
    {
        FirstType.Foo();
    }
    else
    {
        SecondType.Bar();
    }
}

Si ambos tipos tienen beforefieldinit aplicado (lo que en C # lo hacen de manera predeterminada a menos que el tipo tenga un constructor estático), entonces ambos se inicializarán en el inicio del método DoSomething (generalmente, no está garantizado). Si no tienen beforefieldinit , solo se inicializará uno de ellos, según la bandera.

Es por eso que es común usar un constructor estático (¡incluso uno vacío!) cuando implementando patrón de singleton .

Otros consejos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top