嵌套构造函数(或工厂方法)是否良好,或者每个都应该执行所有初始化工作

对于重载的New或Factory样式方法,嵌套构造函数调用(从设计POV)是一个好主意吗? 这主要适用于简单的构造函数,其中每个重载构建在前一个构建器上。

MyClass( arg1 ) { _arg1 = arg1; _otherField = true; _color="Blue" } MyClass( arg1, arg2) : this(arg1) { _arg2 = arg2 } MyClass( arg1, arg2, arg3) : this(arg1, ar2) { _arg3 = arg3; } 

或者使用工厂方法:

 static NewInstance(arg1 ) { _arg1 = arg1; } static NewInstance(arg1, arg2) { f = NewInstance(arg1); f._arg2 = arg2; } //... and so on 

我可以看到双方都有一些弊端

  • 嵌套隐藏构造函数正在执行的操作
  • 不嵌套重复所有function

所以,这样做是个好主意,还是让我为一些我没有看到的问题做好准备。 出于某种原因,我感到不安,主要是因为它分担了初始化的责任。

编辑: @Jon Skeet :我现在看到为什么这让我很烦心。 我倒退了! 我写了整篇文章,甚至没有注意到,它只是闻到了。 我所拥有的大多数其他情况(我写的),按你推荐的方式做,但这肯定不是我这样做的唯一一个。 我注意到我做得比较复杂,但是我看起来很简单。 我喜欢微编辑。 我也喜欢首字母缩略词!

我认为将构造函数链接在一起是合理的,但我以相反的方式执行 – 具有较少参数的版本调用具有更多参数的版本。 这样就可以非常清楚地发生了什么,并且所有真正的“逻辑”(超出默认值)都在一个地方。 例如:

 public Foo(int x, int y) { this.x = x; this.y = y; precomputedValue = x * y; } private static int DefaultY { get { return DateTime.Now.Minute; } } public Foo(int x) : this(x, DefaultY) { } public Foo() : this(1, DefaultY) { } 

请注意,如果您有许多构造函数重载,您可能希望转而使用静态工厂方法 – 这通常会使代码更清晰,并允许多个方法采用相同的参数集,例如

 public static XmlDocument FromText(string xml) public static XmlDocument FromFile(string filename) 

2016年编辑 :仍然领先于时代,C#从根本上削减或取消其对C#7的记录支持和默认构造函数支持, 最终可能是C#8。

2015编辑 :我远远领先于时间。 C#6和C#7正在消除对构造函数的需求。

如果您正在开发.Net 3.5,我建议不要使用构造函数。 我留下的唯一例外是你使用注入构造函数进行dependency injection。 使用.Net 3.5,他们创建了允许您执行的对象初始化程序

 var myclass = New MyClass { arg1 = "lala", arg2 ="foo" } 

这将使用arg1和arg2分配的值初始化类,同时将arg3保留为

 default(typeof(arg3)).