验证构造函数参数

时间:2012-07-23 19:07:22

标签: c# exception-handling constructor

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

MyObjGroup(MyObj primaryObj)
MyObjGroup(MyObj primaryObj, MyObj secondaryObj)
始终需要

primaryObjsecondaryObj不是。显然,您可以致电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(天堂禁止)可能会称之为别的,所以不能保证你有正确的名字。

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

2 个答案:

答案 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;
}