Что делает флаг prefieldinit?

Что делает флаг beforefieldinit? Когда я смотрю в IL моего класса, я вижу этот флаг, но я не знаю, что делает этот флаг на самом деле?

Ответ 1

Смотрите мою статью по этой самой теме.

В принципе, beforefieldinit означает "тип может быть инициализирован в любой точке до того, как будут указаны какие-либо статические поля". Теоретически это означает, что он может быть очень лениво инициализирован - если вы вызываете статический метод, который не касается каких-либо полей, JIT не нужно инициализировать тип.

На практике это означает, что класс инициализируется раньше, чем в противном случае - это нормально для его инициализации в начале первого метода, который может его использовать. Сравните это с типами, к которым не применяется beforefieldinit, где инициализация типа должна произойти непосредственно перед первым фактическим использованием.

Итак, предположим, что имеем:

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

Если для обоих типов применяется beforefieldinit к ним (что в С# они выполняют по умолчанию, если тип не имеет статического конструктора), то оба они будут инициализированы в начале метода (обычно - это не гарантируется). Если у них нет beforefieldinit, тогда только один из них будет инициализирован на основе флага.

Вот почему обычно используется статический конструктор (даже пустой!), когда реализует одноэлементный шаблон.