Что делает флаг beforefieldinit? Когда я смотрю в IL своего класса, я вижу этот флаг, но я не знаю, что он на самом деле делает?
Смотрите мою статью по этому поводу.
По сути, это beforefieldinit
означает, что «тип может быть инициализирован в любой момент до обращения к каким-либо статическим полям». Теоретически это означает, что его можно очень лениво инициализировать - если вы вызываете статический метод, который не касается каких-либо полей, JIT не нужно инициализировать тип.
На практике это означает, что класс инициализируется раньше, чем в противном случае - это нормально, если он инициализируется в начале первого метода, который может его использовать. Сравните это с типами , которые не были beforefieldinit
применены к ним, когда инициализации типа должна происходить непосредственно перед первым фактическим использованием.
Итак, предположим, у нас есть:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Если beforefieldinit
к ним применяются оба типа (что в C # они делают по умолчанию, если у типа нет статического конструктора), то они оба будут инициализированы в начале DoSomething
метода (обычно - это не гарантируется). Если их нет, beforefieldinit
то только один из них будет инициализирован на основе флага.
Вот почему обычно используется статический конструктор (даже пустой!) При реализации шаблона singleton .
Похоже, что в 4.6 изменится
https://github.com/dotnet/coreclr/issues/1193
источник
beforefieldinit
или нет)?