beforefieldinit标志是做什么的?

beforefieldinit标志是做什么的? 当我看着我的class级的IL,我看到这个标志,但我不知道这个标志实际上是做什么?

看到我在这个问题上的文章 。

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

实际上,这意味着这个类的初始化比其它方法 – 在第一个可能使用它的方法开始时,它可以被初始化。 将它与那些没有应用beforefieldinittypes比较,types初始化必须在第一次实际使用之前立即发生。

所以,假设我们有:

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

如果两个types都应用了beforefieldinit (在C#中它们默认是这样做的,除非types具有静态构造函数),那么它们将在方法开始时被初始化(通常 – 不能保证)。 如果他们没有beforefieldinit那么只有其中的一个会根据该标志被初始化。

这就是为什么在实现单例模式时使用静态构造函数(甚至是空的)是很常见的。

看起来它将在4.6中改变

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