beforefieldinit标志是做什么的?
beforefieldinit标志是做什么的? 当我看着我的class级的IL,我看到这个标志,但我不知道这个标志实际上是做什么?
看到我在这个问题上的文章 。
基本上, beforefieldinit
意味着“该types可以在任何静态字段被引用之前的任何时刻初始化”。 从理论上讲 ,这意味着它可以被非常懒惰地初始化 – 如果你调用一个不接触任何字段的静态方法,JIT不需要初始化types。
实际上,这意味着这个类的初始化比其它方法早 – 在第一个可能使用它的方法开始时,它可以被初始化。 将它与那些没有应用beforefieldinit
types比较,types初始化必须在第一次实际使用之前立即发生。
所以,假设我们有:
public static void DoSomething(bool which) { if (which) { FirstType.Foo(); } else { SecondType.Bar(); } }
如果两个types都应用了beforefieldinit
(在C#中它们默认是这样做的,除非types具有静态构造函数),那么它们都将在方法开始时被初始化(通常 – 不能保证)。 如果他们没有beforefieldinit
那么只有其中的一个会根据该标志被初始化。
这就是为什么在实现单例模式时使用静态构造函数(甚至是空的)是很常见的。
看起来它将在4.6中改变