这是C#6中的有效单身人士

时间:2015-12-22 17:10:08

标签: c# .net singleton

我这是为了实现单例模式

private static ProcessDao _dao;
public static ProcessDao Dao
{
    get { return _dao ?? (_dao = new ProcessDao()); }
}

但在C#6中,自动属性具有默认值。 这是单身人士的正确实施吗?

public static ProcessDao Dao { get; } = new ProcessDao();

1 个答案:

答案 0 :(得分:1)

  

这是单身人士的正确实施吗?

你的第一个例子是错误的,因为它不是单例的线程安全实现。如果多个线程称为ProcessDao.Instance,您可能会看到正在创建私有字段的不同实例。

与此相反,您的第二个示例是线程安全的,因为编译器实际上将您自动实现的getter only属性转换为:

public class ProcessDao
{
    [CompilerGenerated]
    private static readonly ProcessDao <Dao>k__BackingField;
    public static ProcessDao Dao
    {
        [CompilerGenerated]
        get
        {
            return ProcessDao.<Dao>k__BackingField;
        }
    }
    static ProcessDao()
    {
        ProcessDao.<Dao>k__BackingField = new ProcessDao();
    }
}

静态构造函数调用由运行时保证最多一次,因此您还可以保证不会创建多个备份字段实例。

关于懒惰,这取决于你的ProcessDao课程的实施。保证静态构造函数在类的静态字段的第一个引用之前运行。如果暴露了多个静态字段,则第一个将导致调用和分配这些对象。如果您知道自己将使用其他静态成员并希望获得最大的懒惰,请查看.NET 4.0中引入的Lazy<T>类型。