声明一个不能实例化的class有哪些方式?

What are the ways to declare a class that cannot be instantiated?

创建不可实例化的方法有哪些class?一种方法是将其声明为抽象 class。是否可以通过将 class 构造函数设为私有来实现?密封的 class 是不可实例化的吗?还有,在 C# 中还有其他方法吗?

将 class 标记为抽象或静态(它们是互斥的)是仅有的两种方法。将所有构造函数标记为私有不会使 class 无法实例化,因为 class 仍然可以构造自身,而其他构造函数可能可以通过反射来完成。

正如其他人所回答的那样,抽象和静态 classes 无法实例化,但是可以使用 public 成员函数来实例化具有私有构造函数的 class。这就是 singleton 模式的工作原理

这里只有static看起来像完整的解决方案,因为abstractclass仍然可以在实例化从它继承的class实例时被实例化。考虑场景:

abstract class A {  }

class B : A {  } 

somewhere in code :

B instance = new B();  // this creates instance of class A as well

P.S。 起初我虽然 abstract sealed 也可能是这个问题的解决方案,但使用这样的结构没有多大意义,所以它甚至不编译 :

Error   1   'A': an abstract class cannot be sealed or static   D:\Projects\TEST\Testapp\Program.cs 15  27  ITT.Domain

internal classes 仅在您的程序集内部可见,因此无法在该程序集外部实例化。

但据我所知,您仍然可以通过反射创建实例。 您可以通过 ReflectionPermission Class

禁用反射

如上所述,您可以将其声明为 abstract 或添加一个抽象方法。

如果你只想声明一个契约,你可以使用一个接口,但这根本不是 class。

sealed表示不能继承这个class

单例 class每个应用程序只能创建一次 singleton

sealed (C# reference)