应该在构造函数签名中列出可选参数吗?

时间:2012-08-01 22:40:31

标签: c# design-patterns

考虑到最佳实践,将可选参数添加到构造函数签名的可行方法是什么?您是否只列出核心参数并依赖于非可选属性的初始化器?在我看来是最明智的做法!

4 个答案:

答案 0 :(得分:3)

特别是能够使用对象初始化程序分配属性值,构造函数的多次重载远没有它们那么有用。它们在过去主要用于为代码紧凑性设置可变属性。

现在可以写

MyClass my = new MyClass() { PropA = 1, PropB = 2 };

几乎和

一样紧凑
MyClass my = new MyClass(1, 2);

虽然更具表现力。

但是,有时对象的性质决定了重载会为对象使用者提供有意义的契约。例如,为接受长度和宽度的 Rectangle 类提供重载并不是不合理的(我不会在代码审查中使用它)。我个人仍然不会提供重载,因为对象初始化器语法更具表现力,避免了诸如“是那个Rectangle(int length,int width)还是Rectangle(int width,int length)?”之类的问题。在阅读代码时(我知道,intellisense在编写代码时有帮助)。

答案 1 :(得分:1)

我相信这是一个很好的方法。通常人们使用属性作为可选参数;但这会使对象变得可变。使用可选的构造函数参数/ ctor重载是保持对象不可变的好方法。

答案 2 :(得分:1)

根据经验,我只在构造函数中添加 required 的参数来创建有效的工作对象。随着对象初始化器语法的出现,客户端更容易配置他想要的任何其他参数。

但是,我认为此规则 应该有很多例外:很多时候你可能想要提供一个过载,让开发人员更容易和更清楚他能够改变的内容一个对象。

答案 3 :(得分:0)

考虑子类而不是几个构造函数。

原因:通常两个不同的不同构造函数表明需要两种不同的行为。不同的行为应该由不同的类来实现。

子类将具有一个名称,用于指示它是如何成为基类的专用版本,以及一个构造函数,用于确保只能在有效状态下创建此类对象。