Auto-属性 initializer 单例实现

Auto-property initializer Singleton implementation

因此,借助全新的 C# 6,我们获得了那些简洁的自动 属性 初始化程序。我想我不妨利用这些来制作比以往更简洁的单身人士。显然 someone else 也有这个想法。

public sealed class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
    private Singleton() { /* some initialization code */ }
}

我的问题是:

  1. 它的线程安全性如何?
  2. 它是多么懒惰,或者什么时候真正创建了实例? (不是优先级,但可以作为以后的参考)
  3. 总体来说这是个好主意吗?

(它可能看起来类似于 this question,但它不是)

您的代码将扩展为以下内容:

public sealed class Singleton
{
    private static readonly Singleton <Instance>k__BackingField = new Singleton();
    public static Singleton Instance { get { return <Instance>k__BackingField; } }
    private Singleton() { /* some initialization code */ }
}

<Instance>k__BackingField 是编译器生成字段的 unspeakable name。)

因此,您的代码的属性将与上面的代码完全相同。也就是说,这种模式是线程安全的,根据情况它可能是个好主意。

假设您在访问 Instance 之前没有访问此类型的任何其他静态成员,那么惰性的确切程度取决于运行时。通常,它会类似于 "the instance is created the first time a method that could access Instance is JIT-compiled",但您对此没有任何保证。

如果您想确保实例是在 Instance 首次访问之前创建的,请向您的 class 添加一个空的静态构造函数。 (这可能会对性能产生轻微的负面影响,但这对您来说可能无关紧要。)

由于其中大部分并不是真正特定于 C# 6,因此 Jon Skeet 关于 singletons and static constructors/type initializers.

的文章是进一步信息的一个很好的来源