C#Singleton具有公共"实例"字段而不是属性

Ste*_*ett 3 c# singleton

考虑具有类型初始化的单例模式的"标准"C#实现:

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }

    private Singleton() { }
}
Run Code Online (Sandbox Code Playgroud)

静态属性中有什么意义吗?如果静态字段被标记为只读,那么肯定无法从任何地方写入,包括从类外部.为了更简洁的实现,这会有用吗?:

public sealed class Singleton
{
    public static readonly Singleton Instance = new Singleton();
    private Singleton() { }
}
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很好,但我只看过最常用的一个,所以我想知道我错过了什么错.

Jon*_*eet 8

静态属性中有什么意义吗?

是.它隐藏了从完全相同的类中的字段中检索值的实现细节.如果您公开该字段,那么您将永远坚持该实现(假设您以后无法更改/重建引用它的所有代码).如果您使用某个属性,您可以稍后:

  • 改变使用方式 Lazy<T>
  • 如果要在类中使用其他静态方法,请使用嵌套类中的字段来获得可能更加懒惰的初始化
  • 使用一些尚未设计的新的时髦方案

基本上,有了房产,您可以选择未来的变化.有了一个领域,你没有.

我曾经不认为这是一个相关的区别,但在Noda Time中,我遇到过复杂类型初始化排序问题使我能够控制这类事情非常重要的情况.我在早期版本中暴露了一个公共静态只读字段,我后来后悔了:(

公共静态只读字段在仍然是单例的情况下工作 - 它只是给你较少的控制.

另外,您可能希望在类中添加一个空的静态构造函数.请参阅我关于单例实现的文章以及beforefieldinit更多详细信息.