在这个问题上见my article.
基本上,beforefieldinit
意味着"在引用任何静态字段之前,可以在任何点初始化类型."In theory这意味着它可以被初始化——如果你调用一个不涉及任何字段的静态方法,JIT不需要初始化类型.
In practice这意味着该类比其他方法初始化earlier——在might使用它的第一个方法开始时初始化它是可以的.将其与don't已应用beforefieldinit
的类型进行比较,其中类型初始化必须在第一次使用之前立即发生.
那么,假设我们有:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
如果两个类型都应用了beforefieldinit
值(在C#中,除非该类型有静电构造函数,否则默认情况下是这样),那么它们将在DoSomething
方法的开始处被初始化为both值(通常-这是不能保证的).如果它们没有beforefieldinit
个,那么根据标志只会初始化其中的one个.
这就是为什么经常使用静态构造函数(甚至是空构造函数!)implementing the singleton pattern岁的时候.