2012-07-23 5 views
1

내가 두 생성자를 가진 클래스가 변수. secondaryObj은 그렇지 않습니다. 분명히 MyObjGroup(myObj) 또는 MyObjGroup(myObj, null)으로 전화하여 동일한 결과를 얻을 수 있습니다.검증 생성자는

제가 처음으로 생각한 것은 nullprimaryObj으로 확인하고 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; 
    } 
} 

그러나, 속성의 매개 변수의 이름은 primaryObj을 호출됩니다의 ctor에서 value 동안이다. 다른 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

+0

'base (이)가 아니라 두번째 ctor에서'this (primaryObj)'를 사용 하시겠습니까? –

+0

예, 고쳐졌습니다. 날카로운 눈을 가져 주셔서 감사합니다. – StriplingWarrior

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