我想知道这两个单例类之间的区别是什么。我的教授向我们展示了最后一个,我们说它在性能上更灵活,更好。我也想知道为什么我的教授版本具有私有构造函数,有人可以弄清为什么吗?
版本1-我的版本(我认为是标准版本):
public class Singleton {
public static Singleton GetInstance() {
return Singleton.instance ?? (Singleton.instance = new Singleton());
}
第2版-灵活而高性能:
public class Singleton {
private Singleton() {} // Why this?
private static class SingletonHolder() {
public static readonly Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
答案 0 :(得分:2)
构造函数是私有的,以防止其他人显式实例化该类,从而严格执行单例模式。
对于嵌套类,它使它变得懒惰且线程安全,而无需锁定。灵活性和高性能是这些主要好处之上的语义。 (我的意思是,如果您真的想要高性能,则应使用C或C ++进行编码)。乔恩·斯基特(Jon Skeet)在此进行了解释。 https://csharpindepth.com/articles/Singleton(第五版)
在当今时代,版本1并不是完全标准的,大多数库使用System.Lazy<T>
包装器来管理惰性,而无需嵌套类的样板。
答案 1 :(得分:2)
在c#中,私有构造函数是一个特殊的实例构造函数,它在仅包含
static
个成员的类中使用。如果一个类包含一个或多个私有构造函数而没有公共构造函数,则除嵌套类之外,其他所有类均不允许为该特定类创建实例。
构造函数是private
,因为我们不希望任何外部类创建此类的实例。
关于性能,在version 1
中,您必须检查:如果类的实例为空,则创建一个实例,但是在version 2
中,您有一个{{1} }具有static
字段的构造函数,这意味着该实例将在第一次调用类时初始化,而在下一次调用时将不再调用静态构造函数。
有关readonly
模式的更多说明,您可以遵循以下link