我这是为了实现单例模式
private static ProcessDao _dao;
public static ProcessDao Dao
{
get { return _dao ?? (_dao = new ProcessDao()); }
}
但在C#6中,自动属性具有默认值。 这是单身人士的正确实施吗?
public static ProcessDao Dao { get; } = new ProcessDao();
答案 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>
类型。