C# 无参数构造函数

C# 无参数构造函数,c#,class,constructor,C#,Class,Constructor,在C#中,有没有办法强制类必须具有无参数构造函数?如果您谈论的是泛型约束,那么是的: class SomeContainer<T> where T : new() { ... } 如果你说的是一门课,是的;只要放一个进去。这取决于你的意思 例如,您可以约束类或方法中的泛型类型参数,使其具有带有new关键字的无参数构造函数,但没有真正的方法将实际类定义限制在该构造函数之外 public void DoSomething<T>() where T : new()

在C#中,有没有办法强制类必须具有无参数构造函数?

如果您谈论的是泛型约束,那么是的:

class SomeContainer<T> where T : new() {
    ...
}


如果你说的是一门课,是的;只要放一个进去。

这取决于你的意思

例如,您可以约束类或方法中的泛型类型参数,使其具有带有
new
关键字的无参数构造函数,但没有真正的方法将实际类定义限制在该构造函数之外

public void DoSomething<T>() where T : new() { }
public void DoSomething(),其中T:new(){}

正如官方MSDN文档中提到的,C#编译器自动生成一个无参数构造函数,将所有成员变量初始化为默认值。如果您希望实施自己的实现,只需执行以下操作:

类基类 { 基类(){//无参数构造函数的实现} }

如果您指的是一般约束,那么请参阅SLaks的帖子

参考资料


我已经多次遇到类似的问题,我认为需要抽象/接口构造函数。问题在于,当您使用
Activator.CreateInstance
或其他技术来实例化一个您可能无法实现的类型(非常常见的IoC)时。如果您可以强制开发人员使用正确的参数来实现构造函数,即使目的只是将参数传递给基本构造函数,生活也会轻松得多


自2.0以来,
new()
约束对这个问题起到了一定的帮助,但它仍然不能解决使用非泛型时的问题,或者如果您确实需要特定的参数(并且不想弄乱无法静态检查的笨拙的构造函数Info)。

泛型可以强制执行此操作,但我们并不总是使用泛型;p

如果您使用的是单元测试,那么您可以使用反射来查找所有符合您希望具有无参数构造函数的模式的类型(例如,从
MyBaseObject
派生的所有类型,或者
Foo.Bar
命名空间中的所有类型),并通过查找无参数构造函数来验证


如果您也想在运行时(可能在
#DEBUG
中)断言此属性,静态构造函数等可以成为插入额外类型检查的有用点。

此外,您可以通过使用私有访问修饰符强制类不具有无参数构造函数。子类仍然可以具有无参数构造函数,即使基类构造函数是私有的,只要至少有一个基类构造函数是公共的或受保护的(如果子类在同一个程序集中,则为内部的)。@Postman:这会限制子类始终向基类构造函数提供某些参数,但这与“不起作用”相去甚远。
public void DoSomething<T>() where T : new() { }