3

私は次のクラスを持っています:

class Foo
{
    public Foo()
        : this(new List<Bar>())
    {
    }

    public Foo(IEnumerable<Bar> bars)
    {
        Bars = bars;
    }

    public IEnumerable<Bar> Bars { get; set; }

    public Bar GetSingleBar(Data data)
    {
        // this method returns a single Bar from the Bars property above
        // this method returns the Bar which matches the data parameter
        // this method should not return null
        // this method throws a NoBarsFoundException if
        //   (a) Bars is empty or
        //   (b) no bar in Bars matches the data
    }
}

Barsの場合はどうすればよいですnullか? のセッターで例外をスローする必要がありますかBars、または で例外をスローする必要がありGetSingleBarますか? (このメソッドは、プロパティGetSingleBarを使用する唯一のメソッドです。)Bars

ArgumentExceptionArgumentNullExceptionInvalidOperationException、またはをスローする必要がありNoBarsFoundExceptionますか?

4

6 に答える 6

5

おそらく:System.ArgumentNullException

Nothingnull 参照 ( Visual Basic の場合) が、それを有効な引数として受け入れないメソッドに渡された場合にスローされる例外。

throw new ArgumentNullException("bars");
于 2012-06-22T13:26:17.307 に答える
2

オブジェクトの現在の状態では操作が無効であり、クラスのプロパティである ため、をスローする必要がありBarsます。nullnullInvalidOperationExceptionGetSingleBarBars

ArgumentNullExceptionは、名前が示すように、引数が の場合にのみスローする必要がありますnull

私は作ることを検討しBars readonlyます(可能であれば)。

于 2012-06-22T13:28:12.593 に答える
0

これはおそらく、この質問からの回答に基づいて、プロパティ セッターを使用せずにメソッドを使用する正当な理由です。

ベスト プラクティス: プロパティからの例外のスロー

これは、プロパティが例外の形で安全でなくなる可能性があるためです。

それを気にする代わりにArgumentNullException、提供された引数がnullの場合の標準です(少なくともメソッドの場合)。

Bars次に、設定または何かの前に使用しようとするInvalidOperationExceptionと、オブジェクトがアクションに対応する有効な状態にないことを示すために をスローします。

于 2012-06-22T13:28:08.880 に答える
0

GetSingleBar メソッドで NoBarsFoundException をスローします。このようにして、GetSingleBar を null にする別のメソッドを持つことができます。

Bars が Null になるのを常に防止したい場合は、コンストラクターに設定してプライベートにする必要がありますか?

于 2012-06-22T13:29:10.790 に答える
0

空のコレクションによってオブジェクトの一貫性が失われる場合は、setter をスローします。

将来、他の新しい方法がどのように使用Barsされるかはわかりません。

于 2012-06-22T13:31:41.707 に答える
0

「エラー」が発生している場所であるため、値を設定するときにエラーをスローする必要があります。

ArgumentNullException も正しいエラー メッセージです。

私が抱えている 1 つの問題は、ほとんどのプログラマーは例外がスローされることを想定していないため、set メソッドと読み取り専用プロパティを用意する必要があるということです。ただし、完全に許容されます-プロパティと例外

于 2012-06-22T13:31:50.357 に答える