我有一个包含两个构造函数的类:
MyObjGroup(MyObj primaryObj)
MyObjGroup(MyObj primaryObj, MyObj secondaryObj)
始终需要 primaryObj
。 secondaryObj
不是。显然,您可以致电MyObjGroup(myObj)
或MyObjGroup(myObj, null)
并最终获得相同的结果。
我首先考虑的是在我的第一个ctor,检查null
上的primaryObj
并投掷ArgumentNullException
。我还需要在我的辅助ctor中执行此操作,复制代码,因此我考虑将其移至属性设置器。
private MyObj _primaryObj;
public MyObj PrimaryObj
{
get {return _primaryObj;}
private set
{
if(value == null) throw new ArgumentNullException("value", "PrimaryObj cannot be null");
_primaryObj = value;
}
}
但是,属性中的参数名称为value
,而在ctor中,它的名称为primaryObj
。另一个ctor(天堂禁止)可能会称之为别的,所以不能保证你有正确的名字。
这里推荐的行动方案是什么?
答案 0 :(得分:3)
检查第一个构造函数中的值,让第二个构造函数对其进行传递,以避免重复代码。
public MyObjGroup(MyObj primaryObj)
{
if(primaryObj == null)
throw new ArgumentNullException("value", "PrimaryObj cannot be null");
}
public MyObjGroup(MyObj primaryObj, MyObj secondaryObj)
: this(primaryObj)
{
SecondaryObj = secondaryObj;
}
答案 1 :(得分:2)
我总是把逻辑放在尽可能少的构造函数中,所以我会这样做:
public MyObjGroup(MyObj primaryObj) : this(primaryObj, null) { }
public MyObjGroup(MyObj primaryObj, MyObj secondaryObj) {
if (primaryObj == null) {
throw new ArgumentNullException("value", "PrimaryObj cannot be null");
}
SecondaryObj = secondaryObj;
PrimaryObj = primaryObj;
}