【发布时间】:2016-07-08 03:34:39
【问题描述】:
我试图理解为什么这是单例模式的正确实现:
public sealed class Singleton : ISingleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { }
// methods
}
beforefieldinit 标志呢?据乔恩斯基特article:
只有当类型没有使用名为 beforefieldinit 的特殊标志标记时,.NET 才能保证类型初始值设定项的惰性。不幸的是,C# 编译器(至少在 .NET 1.1 运行时中提供)将所有没有静态构造函数的类型(即看起来像构造函数但标记为静态的块)标记为 beforefieldinit。
最新版C#不需要静态构造函数了吗?
上面的代码是由 Jon Skeet 在 NodaTime 项目中实现的SystemClock。'
编辑 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 Instance
{
get
{
return instance;
}
}
}
【问题讨论】:
-
那个标志呢?我不明白这个问题。
-
@usr 查看编辑:)
-
显式指定
beforefieldinit行为存在一个突出的 C# 语言设计问题:github.com/dotnet/roslyn/issues/4448 (fyi) -
Roslyn online 说该类型被标记为 beforefieldinit:tryroslyn.azurewebsites.net/#f:r/…
-
beforefieldinit的问题是指实例实例化的惰性,而不是实现是否是正确且安全的单例。您提到的 Jon Skeet 帖子中有一个“性能与懒惰”部分,其中更详细地说明了为什么您可能关心懒惰。