首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动属性初始化器单例实现

自动属性初始化器单例实现
EN

Stack Overflow用户
提问于 2015-09-23 11:24:57
回答 1查看 1.7K关注 0票数 9

因此,使用全新的C# 6,我们得到了那些整洁的自动属性初始化器。我想我还是利用这些来做比以往更简洁的单身汉吧。显然,其他人也有这个想法。

代码语言:javascript
复制
public sealed class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
    private Singleton() { /* some initialization code */ }
}

我的问题是:

  1. 它有多安全?
  2. 它有多懒,或者实例实际上是什么时候创建的?(不是优先事项,但对今后的参考是有益的)
  3. 总的来说,这是个好主意吗?

(它看起来可能类似于这个问题,但它不是)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 22:10:27

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

代码语言:javascript
复制
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是编译器生成字段的说不出的名字。)

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

假设在访问Instance之前没有访问此类型的任何其他静态成员,那么懒惰的确切程度取决于运行时。通常情况下,它将类似于“第一次创建一个可以访问Instance的方法是JIT编译的方法”,但是您没有任何保证。

如果希望确保在首次访问Instance之前创建实例,请向类中添加一个空的静态构造函数。(这可能对性能有很小的负面影响,但这对你来说可能无关紧要。)

由于这其中的大部分并不是C# 6所特有的,更好的信息来源将是Jon关于单身汉静态构造函数/类型初始化器的文章。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32738283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档