考虑到最佳实践,将可选参数添加到构造函数签名的可行方法是什么?您是否只列出核心参数并依赖于非可选属性的初始化器?在我看来是最明智的做法!
答案 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)
考虑子类而不是几个构造函数。
原因:通常两个不同的不同构造函数表明需要两种不同的行为。不同的行为应该由不同的类来实现。
子类将具有一个名称,用于指示它是如何成为基类的专用版本,以及一个构造函数,用于确保只能在有效状态下创建此类对象。