1

我有一个有两个构造函数的类:

MyObjGroup(MyObj primaryObj)
MyObjGroup(MyObj primaryObj, MyObj secondaryObj)

primaryObj总是需要的。secondaryObj不是。显然,您可以调用MyObjGroup(myObj)orMyObjGroup(myObj, null)并得到相同的结果。

我首先考虑做的是在我的第一个 ctor 中,检查nullprimaryObj抛出一个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。另一个演员(天堂禁止)可能会称它为别的名字,所以不能保证你有正确的名字。

这里推荐的行动方案是什么?

4

2 回答 2

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;
}
于 2012-07-23T19:10:10.037 回答
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;
}
于 2012-07-23T19:36:02.993 回答