声明一个不能实例化的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
看起来像完整的解决方案,因为abstract
class仍然可以在实例化从它继承的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
创建不可实例化的方法有哪些class?一种方法是将其声明为抽象 class。是否可以通过将 class 构造函数设为私有来实现?密封的 class 是不可实例化的吗?还有,在 C# 中还有其他方法吗?
将 class 标记为抽象或静态(它们是互斥的)是仅有的两种方法。将所有构造函数标记为私有不会使 class 无法实例化,因为 class 仍然可以构造自身,而其他构造函数可能可以通过反射来完成。
正如其他人所回答的那样,抽象和静态 classes 无法实例化,但是可以使用 public 成员函数来实例化具有私有构造函数的 class。这就是 singleton 模式的工作原理
这里只有static
看起来像完整的解决方案,因为abstract
class仍然可以在实例化从它继承的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