为什么 C# 中的单例类总是密封的?


sealed 关键字意味着不能从该类继承。将构造函数声明为私有意味着无法创建类的实例。

你可以有一个带有私有构造函数的基类,但仍然可以从该基类继承,定义一些公有构造函数,并有效地实例化该基类。

不会继承构造函数(因此派生类不会仅仅因为基类具有私有构造函数就拥有所有私有构造函数),并且派生类始终首先调用基类构造函数。

标记该类为 sealed 可以防止某人简单地绕过你精心构建的单例类,因为它可以防止某人从该类继承。

示例

static class Program {
   static void Main(string[] args){
      Singleton fromStudent = Singleton.GetInstance;
      fromStudent.PrintDetails("From Student");

      Singleton fromEmployee = Singleton.GetInstance;
      fromEmployee.PrintDetails("From Employee");

      Console.WriteLine("-------------------------------------");

      Singleton.DerivedSingleton derivedObj = new Singleton.DerivedSingleton();
      derivedObj.PrintDetails("From Derived");
      Console.ReadLine();
   }
}
public class Singleton {
   private static int counter = 0;
   private static object obj = new object();

   private Singleton() {
      counter++;
      Console.WriteLine("Counter Value " + counter.ToString());
   }
   private static Singleton instance = null;

   public static Singleton GetInstance{
      get {
         if (instance == null)
            instance = new Singleton();
         return instance;
      }
   }

   public void PrintDetails(string message){
      Console.WriteLine(message);
   }

   public class DerivedSingleton : Singleton {
   }
}

更新于: 2020 年 11 月 25 日

1K+ 次浏览

事业启动

完成课程以获得认证

开始
广告