beforefieldinit标志有什么作用?当我查看班级的IL时,我看到了这个标志,但是我不知道这个标志实际上在做什么?
beforefieldinit标志有什么作用?当我查看班级的IL时,我看到了这个标志,但是我不知道这个标志实际上在做什么?
Answers:
基本上,beforefieldinit
意味着“可以在引用任何静态字段之前的任何时候初始化类型”。从理论上讲,这意味着可以非常延迟地初始化-如果您调用不涉及任何字段的静态方法,则JIT不需要初始化类型。
实际上,这意味着该类的初始化要比其他情况早得多-可以在可能使用该类的第一个方法的开始处对其进行初始化是可以的。有哪些类型比较这不已经beforefieldinit
应用到它们,其中类型初始化到第一前刚刚发生的实际使用。
因此,假设我们有:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
如果两种类型都beforefieldinit
应用了它们(在C#中,除非类型具有静态构造函数,否则它们默认情况下会执行),然后它们都将在DoSomething
方法开始时进行初始化(通常-不保证)。如果没有,则将根据标志beforefieldinit
仅初始化其中之一。
这就是为什么在实现单例模式时通常使用静态构造函数(甚至是空的构造函数!)的原因。
看起来它将在4.6中更改
beforefieldinit
)?