我正在this great resource阅读C#中的单身人士课程设计,并决定选择其他4:
public sealed class Singleton1
{
static readonly Singleton1 _instance = new Singleton1();
static Singleton1()
{
}
Singleton1()
{
}
public static Singleton1 Instance
{
get
{
return _instance;
}
}
}
现在我想知道是否可以使用像这样的自动属性重写这个?
public sealed class Singleton2
{
static Singleton2()
{
Instance = new Singleton2();
}
Singleton2()
{
}
public static Singleton2 Instance { get; private set; }
}
如果它只是一个可读性问题,我肯定更喜欢第二个版本,但我想要做对。
答案 0 :(得分:7)
它会正常工作,但实际上并不相同。
即使属性被标记为私有,它也不是只读的(例如,仅在构造函数中可分配)。因此,您应该使用第一个变体,它表示具有变量(引用)的意图,该变量在初始赋值后不会发生变化。
答案 1 :(得分:4)
这不等同,因为autoproperty的支持字段不是readonly
。
答案 2 :(得分:0)
该属性的支持字段不是readonly
,但由于这是一个私有财产,因此它不是一个很大的问题。但是第一个实现的最大优点是可以删除静态构造函数,但对于第二个实现,则使用静态构造函数。静态构造函数可以添加性能命中(请参阅http://msdn.microsoft.com/en-us/library/ms182275(v=VS.100).aspx)
答案 3 :(得分:0)
此处要考虑的另一件事是初始化属性比仅初始化字段更有用。
Singleton2中的静态构造函数调用属性上的set方法,然后设置后备字段的值。我不知道这是否或如何影响线程安全,但这是另一个区别。