beforefieldinit旗帜做什么?当我查看我班级的IL时,我看到了这个标志,但我不知道这个标志实际上在做什么?
在这个问题上看到我的文章.
基本上,beforefieldinit
意味着"可以在引用任何静态字段之前的任何点初始化类型".理论上,这意味着它可以非常懒惰地初始化 - 如果你调用一个不接触任何字段的静态方法,JIT不需要初始化类型.
在实践中,它意味着类比其他方式更早地初始化- 可以在第一个可能使用它的方法的开头初始化它.有哪些类型比较这不已经beforefieldinit
应用到它们,其中类型初始化到第一前刚刚发生的实际使用.
所以,假设我们有:
public static void DoSomething(bool which) { if (which) { FirstType.Foo(); } else { SecondType.Bar(); } }
如果这两种类型都beforefieldinit
适用于它们(在C#中默认情况下它们除非类型具有静态构造函数),那么它们都将在DoSomething
方法开始时初始化(通常 - 不保证).如果他们没有,beforefieldinit
那么根据旗帜只会初始化其中一个.
这就是为什么在实现单例模式时使用静态构造函数(甚至是空构造函数!)的常见原因.
看起来它将在4.6中更改
https://github.com/dotnet/coreclr/issues/1193