Что делает флаг beforefieldinit? Когда я смотрю в IL моего класса, я вижу этот флаг, но я не знаю, что делает этот флаг на самом деле?
Что делает флаг prefieldinit?
Ответ 1
Смотрите мою статью по этой самой теме.
В принципе, beforefieldinit
означает "тип может быть инициализирован в любой точке до того, как будут указаны какие-либо статические поля". Теоретически это означает, что он может быть очень лениво инициализирован - если вы вызываете статический метод, который не касается каких-либо полей, JIT не нужно инициализировать тип.
На практике это означает, что класс инициализируется раньше, чем в противном случае - это нормально для его инициализации в начале первого метода, который может его использовать. Сравните это с типами, к которым не применяется beforefieldinit
, где инициализация типа должна произойти непосредственно перед первым фактическим использованием.
Итак, предположим, что имеем:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Если для обоих типов применяется beforefieldinit
к ним (что в С# они выполняют по умолчанию, если тип не имеет статического конструктора), то оба они будут инициализированы в начале метода (обычно - это не гарантируется). Если у них нет beforefieldinit
, тогда только один из них будет инициализирован на основе флага.
Вот почему обычно используется статический конструктор (даже пустой!), когда реализует одноэлементный шаблон.
Ответ 2
Похоже, что он изменится в 4.6