这两个单例类结构之间有什么区别?

时间:2019-06-08 05:58:07

标签: c# singleton

我想知道这两个单例类之间的区别是什么。我的教授向我们展示了最后一个,我们说它在性能上更灵活,更好。我也想知道为什么我的教授版本具有私有构造函数,有人可以弄清为什么吗?

版本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;
    }
}

2 个答案:

答案 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