【问题标题】:Why in spite of having private constructor, it uses SEALED in the class in MSDN为什么尽管有私有构造函数,它在 MSDN 的类中使用 SEALED
【发布时间】:2015-03-20 04:07:04
【问题描述】:

我只是在学习 Singleton 以加深我对此的了解。

我遇到过 MSDN,它使用 SEALED 并声称我们无法进一步派生,因此当我们的目标是单例时无法创建派生的实例。我同意。

但是,我看到已经有一个私有构造函数来防止派生,当我在 VS 中尝试它时,它说由于保护级别而无法访问,这很公平。所以我觉得这本身就解决了不允许推导的目的。为什么要密封?为什么特别是在文档中,他们写到使用 Sealed 来实现这一点,而他们没有为此目的说明私有构造函数?

我真的很好奇,因为我正处于学习曲线中。请帮忙。

这是 MSDN 文章的内容:

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

   private Singleton(){}

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

我指的网站是这样的:

https://msdn.microsoft.com/en-us/library/ff650316.aspx

【问题讨论】:

    标签: c# asp.net .net singleton


    【解决方案1】:

    因为如果您使用嵌套类,您可以从父类继承并提供这样的公共构造函数...

    public class Parent 
    {
        private Parent(){}
    
        public class Child : Parent
        {
            public Child() {}
        }
    }
    

    现在你可以这样做了……

    var child = new Parent.Child();
    

    这打破了单例模式。添加 sealed 修饰符可以防止这种情况发生。

    【讨论】:

    • 鞋,非常感谢,很公平,但是为什么我还要在实现 Singleton 的类中编写子类呢?是否有任何实时场景可以让我从这种编码风格中受益?否则我完全同意你的看法。请帮助我,只是好奇并进行积极的讨论:)
    • 您可能不会,但与您合作的开发人员可能会因为他不明白为什么不应该这样做。
    • 谢谢 :) 一个小问题;为什么他们在这里使用只读?虽然我知道 readonly 的意思,但不明白他们为什么要在这里使用它,还是如果不在这里使用 readonly 就无法使用相同的代码实现单例?
    • readonly 防止实例从类本身的任何位置重新分配,静态构造函数除外。
    • @VictorMukherjee:伙计,这里没有静态构造函数。为了帮助您理解我的问题,当我删除 READONLY 时,它的行为仍然相同。为什么这里是只读的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多