无参数构造函数

问题描述:

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

+0

请提供更多的细节。 – SLaks 2010-07-13 02:35:19

如果你在谈论泛型约束,是:

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的 { 的BaseClass(){//参数的构造函数的执行}}

如果你指的是通用的限制,然后参考SLaks的帖子。

参考

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

+2

此外,您可以强制类不利用私有访问修饰符有一个参数的构造函数。 – 2010-07-13 02:35:40

+1

只要至少有一个基础构造函数是public或protected(或者如果子类在同一个程序集中),子类仍然可以有无参数的构造函数,即使基类构造函数是私有的。 – 2010-07-13 02:38:16

+0

@Postman:它会限制子始终提供一定的参数给基类的构造,但是这是从“行不通”相去甚远。 – 2010-07-13 02:39:24

我遇到这样的问题很多次,我认为有抽象/接口构造的要求。麻烦的是当你使用Activator.CreateInstance或其他技术来实例化一个你可能不会实现的类型(很常见的IoC)。如果您可以强制开发人员使用正确的参数来实现构造函数,生活将会变得更加简单 - 即使目的仅仅是将参数传递给基础构造函数。

new()约束从2.0开始就帮助解决了这个问题,但是在使用不使用泛型时仍然不能解决问题,或者如果您确实需要特定参数(并且不想混淆尴尬ConstructorInfo,它不能被静态检查。)

泛型可以强制执行这一点,但我们并不总是使用泛型,P

如果您正在使用单元测试,你可以使用反射来找到所有符合模式的类型,您有参数构造函数(例如,一切从MyBaseObject衍生,或一切都在Foo.Bar命名空间),并验证方式(由找到参数构造)。

如果你想在运行时断言这也(也许在#DEBUG),像静态构造函数是有用的点注入额外类型的检查。