1

2つのコンストラクターを持つクラスがあります。

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

primaryObj常に必要です。secondaryObjではありません。明らかに、MyObjGroup(myObj)またはMyObjGroup(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ます。別のctor(天国は禁じられています)はそれを他の何かと呼ぶかもしれないので、あなたが正しい名前を持っているという保証はありません。

ここで推奨される行動方針は何ですか?

4

2 に答える 2

3

最初のコンストラクターの値を確認し、コードの重複を避けるために2番目のコンストラクターにパススルーを実行させます。

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 に答える