Co robi flaga beforefieldinit? Kiedy patrzę na IL mojej klasy, widzę tę flagę, ale nie wiem, co ta flaga właściwie robi?
Zobacz mój artykuł na ten temat.
Zasadniczo beforefieldinit
oznacza „typ można zainicjować w dowolnym momencie przed odwołaniem się do jakichkolwiek pól statycznych”. W teorii oznacza to, że może być inicjalizowany bardzo leniwie - jeśli wywołasz metodę statyczną, która nie dotyka żadnych pól, JIT nie musi inicjować typu.
W praktyce oznacza to, że klasa jest inicjalizowana wcześniej niż byłoby inaczej - można ją zainicjować na początku pierwszej metody, która może jej użyć. Porównaj to z typami, które nie zostały beforefieldinit
do nich zastosowane, gdzie inicjalizacja typu musi nastąpić bezpośrednio przed pierwszym faktycznym użyciem.
Załóżmy więc, że mamy:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Jeśli beforefieldinit
zastosowano do nich oba typy (co w C # robią domyślnie, chyba że typ ma konstruktora statycznego), oba zostaną zainicjowane na początku DoSomething
metody (zwykle - nie jest to gwarantowane). Jeśli nie mają, beforefieldinit
tylko jeden z nich zostanie zainicjowany na podstawie flagi.
Dlatego często podczas implementowania wzorca singleton używa się konstruktora statycznego (nawet pustego!) .
Wygląda na to, że to się zmieni w 4.6
https://github.com/dotnet/coreclr/issues/1193
źródło
beforefieldinit
było)?