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