C#中的单例类设计,这两个类是等价的吗?

时间:2010-04-12 07:28:50

标签: c# design-patterns refactoring singleton

我正在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; }
}

如果它只是一个可读性问题,我肯定更喜欢第二个版本,但我想要做对。

4 个答案:

答案 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方法,然后设置后备字段的值。我不知道这是否或如何影响线程安全,但这是另一个区别。