2012-07-23 86 views
1

我有两个构造函数的类:验证构造函数的参数

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

primaryObj始终是必需的。 secondaryObj不是。显然你可以拨打MyObjGroup(myObj)MyObjGroup(myObj, null),最后得到相同的结果。

我第一次考虑的是在我的第一个ctor中,在null上检查primaryObj并抛出ArgumentNullException。我还需要在我的辅助计算机上执行此操作,复制代码,因此我考虑将其移至属性设置器。

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,而在它被称为primaryObj的构造函数。另一个ctor(天堂禁止)可能称之为别的东西,所以不能保证你有正确的名字。

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

回答

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

是不是真的'基地(primaryObj)''没有这个(primaryObj)'? – Arne 2012-07-23 19:17:18

+0

你是不是指第二个ctor上的':this(primaryObj)'而不是'base'? – 2012-07-23 19:18:54

+0

是的,我修好了。谢谢你敏锐的眼睛。 – StriplingWarrior 2012-07-23 19:22:57

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; 
} 
+0

我实际上认为这是因为这与添加验证前我如何构造它们相似。在我的例子中,这将工作,但我实际上已经过度简化了与我的实际情况相比的问题。 – earthling 2012-07-23 19:52:08