c# - 为什么 'readonly' 在下面的 Singleton 实现中必不可少?

标签 c# .net singleton readonly

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

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

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

我认为即使从 instance 成员实例化中删除 readonly 关键字,单例仍然可以正常工作。

  • 它是静态的,只有一个实例存在。
  • 该值无法更改,因为它没有 setter。
  • 它是一个密封类,不能被子类化。

请帮我纠正一下我对这里概念的理解。

最佳答案

因为如果该字段未标记为只读,则可以在 Singleton 类中对其进行修改。当然,它仍然不能被外界修改,但是如果在你的程序的生命周期中有多个实例,那么单例就真的不是单例,并且 readonly 说明符强制执行你想要的语义单例类。

编辑响应:

  1. Its static, only one instance would exist.
  2. The value cant change, as it has no setter.

静态变量当然可以设置为在运行时引用不同的对象。该值可以更改,如果仅在类内更改,因为它是私有(private)的。如果类的实现使得该字段只被分配一次,那么在实践中就不会成为问题。然而,由于假定的意图是单例实例永远不会改变,所以 readonly 修饰符保证了构造函数之外的那些语义。它不是必需的,因为类的客户无法更改引用,但它是首选,因为它 a) 使代码的意图清晰,并且 b) 防止引用甚至在类内被更改。

关于c# - 为什么 'readonly' 在下面的 Singleton 实现中必不可少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826142/

相关文章:

c# - Entity Framework 多对多自关联与乐观并发控制

c# - WPF 进度条未显示正确的进度

c# - IEnumerable 中的求和、平均、连接等项的实现选项

c# - 使用 Table Per Hierarchy 继承在 LINQ to Entities 查询中转换为派生类型

c# - 了解 MassTransit 中的 "Finalize"

java - Java中的单例和继承

c# - 在整个文件中进行多行正则表达式搜索

c# - 动态生成时如何检索已单击的按钮

java - 用于测试 oObject 创建者的 Java 静态变量

c++ - 为什么这个单例实现使用私有(private)类(C++)?