c# – 自动属性初始化器Singleton实现

因此,使用全新的C#6,我们获得了那些整洁的自动属性初始化器.我想我也可以利用这些来制作比以往更简洁的单身人士.显然 someone else也有这个想法.
public sealed class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
    private Singleton() { /* some initialization code */ }
}

我的问题是:

>它的线程安全性如何?
>它是多么懒惰,或实际创建实例的时间? (不是优先考虑,但对未来的参考会有好处)
>总体来说这是一个好主意吗?

(它看起来可能类似于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之前没有访问此类型的任何其他静态成员,那么确切的懒惰程度取决于运行时.通常,它将类似于“实例是第一次创建可以访问Instance的方法是JIT编译的”,但您对此没有任何保证.

如果要确保在第一次访问Instance之前创建实例,请在类中添加一个空的静态构造函数. (这可能会对性能产生很小的负面影响,但这对您来说可能无关紧要.)

由于大部分内容并非真正针对C#6,因此Jon Skeet关于singletonsstatic constructors/type initializers文章将提供更多信息.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...