2012-07-23 92 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