beforefieldinit旗帜做什么?当我查看我班级的IL时,我看到了这个标志,但我不知道这个标志实际上在做什么?
我试图理解为什么这是Singleton模式的正确实现:
public sealed class Singleton : ISingleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { }
// methods
}
Run Code Online (Sandbox Code Playgroud)
怎么样的beforefieldinit标志?根据Jon Skeet的文章:
类型初始值设定项的懒惰只有在未使用名为beforefieldinit的特殊标志标记类型时才由.NET保证.不幸的是,C#编译器(至少在.NET 1.1运行时中提供)标记所有没有静态构造函数的类型(即看起来像构造函数但被标记为静态的块)作为beforefieldinit.
最新版本的C#中不需要静态构造函数吗?
上面的代码是SystemClockJon Skeet在NodaTime项目中的实现.
编辑 Jon Skeet代码供参考(为什么我提到这个beforefieldinit标志):
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
private Singleton()
{
}
public static Singleton …Run Code Online (Sandbox Code Playgroud)