Co robi flaga beforefieldinit? Kiedy patrzę na IL mojej klasy, widzę tę flagę, ale nie wiem, co ta flaga właściwie robi?
Co robi flaga beforefieldinit? Kiedy patrzę na IL mojej klasy, widzę tę flagę, ale nie wiem, co ta flaga właściwie robi?
Odpowiedzi:
Zobacz mój artykuł na ten temat.
Zasadniczo beforefieldinitoznacza „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 beforefieldinitdo 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 beforefieldinitzastosowano do nich oba typy (co w C # robią domyślnie, chyba że typ ma konstruktora statycznego), oba zostaną zainicjowane na początku DoSomethingmetody (zwykle - nie jest to gwarantowane). Jeśli nie mają, beforefieldinittylko 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
beforefieldinitbyło)?