beforefieldinit旗帜做什么?

时间:2009-03-04 14:29:27

标签: .net cil

beforefieldinit旗帜做什么? 当我查看我的班级的IL时,我看到了这个标志,但我不知道这个标志实际上在做什么?

3 个答案:

答案 0 :(得分:120)

关于这个问题,请参阅my article

基本上,beforefieldinit表示“可以在引用任何静态字段之前的任何时刻初始化类型。” 理论上这意味着它可以非常懒惰地初始化 - 如果你调用一个不接触任何字段的静态方法,JIT不需要初始化类型。

在实践中意味着该类初始化之前比其他情况更少 - 可以在第一个方法的开头初始化 >可能使用它。将此与具有beforefieldinit的类型进行比较,其中类型初始化必须在第一个实际使用之前发生。

所以,假设我们有:

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

如果两种类型都有beforefieldinit应用于它们(除非类型具有静态构造函数,它们在C#中默认情况下执行),那么它们两者在开始时被初始化DoSomething方法(通常 - 不保证)。如果他们没有beforefieldinit,则只会根据该标志初始化中的一个

这就是implementing the singleton pattern时使用静态构造函数(甚至是空构造函数!)的常见原因。

答案 1 :(得分:5)

看起来它将在4.6

中发生变化

https://github.com/dotnet/coreclr/issues/1193

答案 2 :(得分:0)

如果标记为 BeforeFieldInit,则在首次访问为该类型定义的任何静态字段时或之前的某个时间执行该类型的初始化方法。

如果没有标记 BeforeFieldInit 则该类型的初始化方法在 首先访问该类型的任何静态或实例字段,或 第一次调用该类型的任何静态、实例或虚拟方法。