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 说明符强制执行你想要的语义单例类。
编辑响应:
- Its static, only one instance would exist.
- The value cant change, as it has no setter.
静态变量当然可以设置为在运行时引用不同的对象。该值可以更改,如果仅在类内更改,因为它是私有(private)的。如果类的实现使得该字段只被分配一次,那么在实践中就不会成为问题。然而,由于假定的意图是单例实例永远不会改变,所以 readonly 修饰符保证了构造函数之外的那些语义。它不是必需的,因为类的客户无法更改引用,但它是首选,因为它 a) 使代码的意图清晰,并且 b) 防止引用甚至在类内被更改。
关于c# - 为什么 'readonly' 在下面的 Singleton 实现中必不可少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826142/