如何创建一个不可实例化的类?其中一种方法是将其声明为抽象类。将类构造函数设为私有,是否也可以实现这个目的?密封类是否也是不可实例化的?在C#中还有其他方法吗?
如何创建一个不可实例化的类?其中一种方法是将其声明为抽象类。将类构造函数设为私有,是否也可以实现这个目的?密封类是否也是不可实例化的?在C#中还有其他方法吗?
将一个类标记为抽象或静态(它们是互斥的)是唯一的两种方式。将所有构造函数标记为私有并不能使类无法实例化,因为该类仍然可以构造自身,并且其他人可能会通过反射来完成实例化。
在这里,只有 static
看起来是完整的解决方案,因为当从它继承的类实例化时,abstract
类仍然可以被实例化。考虑以下情况:
abstract class A { }
class B : A { }
somewhere in code :
B instance = new B(); // this creates instance of class A as well
附注:
一开始我认为abstract sealed
也许是解决这个问题的方法,但使用这样的结构并没有多大意义,所以它甚至无法编译:
Error 1 'A': an abstract class cannot be sealed or static D:\Projects\TEST\Testapp\Program.cs 15 27 ITT.Domain
abstract sealed
甚至无法编译。 - pwasstatic
编译为MSIL时是abstract sealed
。 - user4003407内部类只能在您的程序集内部可见,因此无法在该程序集外部实例化。
但据我所知,您仍然可以通过反射创建一个实例。您可以通过 ReflectionPermission Class 禁用反射。
如上所述,您可以将其声明为抽象或添加一个抽象方法。
如果您只想声明一个协定,那么您可以使用接口,但那不是一个类。
密封类意味着您不能继承这个类。
单例类每个应用程序只能创建一次 singleton。