为什么在以下单例实现中"只读"必不可少?

Dan*_*han 6 .net c# 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为即使readonlyinstance成员实例中删除关键字,单例仍然可以正常工作.

  • 它的静态,只存在一个实例.
  • 价值不能改变,因为它没有设定者.
  • 它是一个密封的类,不能被分类.

请帮我纠正我对这里概念的理解.

Ed *_* S. 11

因为如果字段没有标记为只读,则可以在Singleton类中进行修改.当然,它仍然无法被外部世界修改,但如果在程序的生命周期中有一个以上的实例,则单例实际上不是单例,并且readonly说明符强制执行您想要的语义单身人士班.

编辑回应:

  1. 它的静态,只存在一个实例.
  2. 价值不能改变,因为它没有设定者.

静态变量当然可以设置为在运行时引用不同的对象.如果仅在类中由于它是私有的,则值可以改变.如果实施该类以使该字段仅被分配一次,则在实践中不会成为问题.但是,由于假定的意图是单例实例永远不会改变,readonly修饰符保证构造函数之外的那些语义.这不是必需的,因为类的客户端不能更改引用,但它是首选的,因为它a)使代码的意图清晰,并且b)防止引用即使在类中也被更改.


Dar*_*rov 7

readonly在这种情况下,使用并不重要,但它通过指示字段的性质来强制执行代码的语义.就个人而言,我总是将readonly关键字用于所有字段声明,其值仅初始化一次.它还可以帮助编译器在某些情况下执行某些优化.