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


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

2 70

2 ответа:

посмотреть мои статьи по этому вопросу.

по сути, beforefieldinit означает, что " тип может быть инициализирован в любой момент до ссылки на любые статические поля."в теории это означает, что это может быть очень лениво. initialized-если вы вызываете статический метод, который не касается каких-либо полей, 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