【发布时间】:2011-03-15 02:37:56
【问题描述】:
在 C# 中,有没有办法强制类必须具有无参数构造函数?
【问题讨论】:
标签: c# class constructor
在 C# 中,有没有办法强制类必须具有无参数构造函数?
【问题讨论】:
标签: c# class constructor
如果您在谈论通用约束,是的:
class SomeContainer<T> where T : new() {
...
}
如果您在谈论继承。不可能要求实现你的接口或继承你的基类的每个类都有一个无参数的构造函数。
您可以做的最好的事情是在基本构造函数中使用反射来抛出异常(在运行时),如下所示:
abstract class MyBase {
protected MyBase() {
if (GetType().GetConstructor(Type.EmptyTypes) == null)
throw new InvalidProgramException();
}
}
如果您说的是单个课程,是的;放一个就行了。
【讨论】:
这取决于你的意思。
例如,您可以使用new 关键字来限制类或方法中的泛型类型参数,使其具有无参数构造函数,但除此之外没有真正的方法来限制实际的类定义。
public void DoSomething<T>() where T : new() { }
【讨论】:
正如 MSDN 官方文档中提到的,C# 编译器会自动生成一个无参数构造函数,将所有成员变量初始化为默认值。如果您希望强制执行您自己的实现,您可以简单地执行以下操作:
类基类 { BaseClass() { // 无参构造函数的实现 } }
如果您指的是通用约束,请参阅 SLaks 的帖子。
参考文献
【讨论】:
我多次遇到这样的问题,我认为需要抽象/接口构造函数。问题是当您使用Activator.CreateInstance 或其他一些技术来实例化您可能无法实现的类型(非常常见的 IoC)时。如果您可以强制开发人员使用正确的参数实现构造函数,那么生活会轻松很多——即使目的只是将参数传递给基本构造函数。
new() 约束自 2.0 以来对问题有所帮助,但在使用不使用泛型时,或者如果您确实需要特定参数(并且不想弄乱难看的 ConstructorInfo,不能静态检查。)
【讨论】:
泛型可以强制执行此操作,但我们并不总是使用泛型;p
如果您正在使用单元测试,您可以使用反射来查找所有符合您希望具有无参数构造函数模式的类型(例如,从MyBaseObject 派生的所有内容,或Foo.Bar 命名空间),并以这种方式验证(通过找到无参数构造函数)。
如果您也想在运行时声明这一点(可能在 #DEBUG 中),静态构造函数之类的东西可能是注入额外类型检查的有用点。
【讨论】: