声明不能实例化的类的方法有哪些?

本文关键字:不能 实例化 声明 方法 | 更新日期: 2023-09-27 18:16:30

创建非实例化类的方法是什么?一种方法是将其声明为抽象类。是否可以通过使类构造函数为私有来做到这一点?密封类是不可实例化的吗?在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

正如其他人的回答,抽象类和静态类不能被实例化,但是具有私有构造函数的类可以通过使用公共成员函数来实例化。这就是单例模式的工作方式

内部类仅在程序集中可见,因此不能在该程序集之外实例化。

但据我所知,你仍然可以通过反射创建一个实例。你可以通过ReflectionPermission类禁用反射

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

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

sealed意味着你不能继承这个类

单例类只能在每个应用程序中创建一次单例

参见sealed (c# reference)

相关文章: