49

読み取り専用または非読み取り専用のいずれかであるカスタムコレクションの実装を実装しています。つまり、コレクションを変更するすべてのメソッドは、道徳的に同等の関数を呼び出します。

private void ThrowIfReadOnly() {
    if (this.isReadOnly)
       throw new SomeException("Cannot modify a readonly collection.");
}

NotSupportedExceptionその場合、どちらを使うべきか、どちらを使うべきかわかりませんInvalidOperationException

4

1 に答える 1

68

MSDNには、この正確なトピックに関するガイダンスが1つだけありますNotSupportedException

オブジェクトが要求された操作を実行できる場合があり、オブジェクトの状態によって操作を実行できるかどうかが決まるシナリオについては、を参照してくださいInvalidOperationException

以下は、純粋に私自身のルールの解釈です。

  • オブジェクトの状態が変化して、オブジェクトの存続期間中に操作が無効/有効になる可能性がある場合は、をInvalidOperationException使用する必要があります。
  • オブジェクトの存続期間中、操作が常に無効/有効である場合は、をNotSupportedException使用する必要があります。
  • その場合、「ライフタイム」とは、「誰でもオブジェクトへの参照を取得できる時間全体」を意味します。つまり、Dispose()他のほとんどのインスタンスメソッドを使用できなくすることが多い呼び出しの後でもです。
    • Martin Liversageが指摘したように、オブジェクトが廃棄された場合は、より具体的なObjectDisposedExceptionタイプを使用する必要があります。(それはまだのサブタイプですInvalidOperationException)。

その場合のこれらのルールの実際の適用は次のようになります。

  • オブジェクトisReadOnlyが作成されたときにのみ設定でき(コンストラクター引数など)、それ以外のときは設定できない場合は、NotSupportedExceptionを使用する必要があります。
  • isReadOnlyオブジェクトの存続期間中に変更できる場合は、InvalidOperationExceptionを使用する必要があります。
    • ただし、コレクションを実装する場合、 InvalidOperationExceptionvsのポイントは実際には重要ではありません。MSDNでNotSupportedExceptionの説明を考慮すると、コレクションが初期化された後、その値が変更されないことが唯一の許可された動作です。つまり、コレクションインスタンスは変更可能または読み取り専用のいずれかですが、初期化時に1つを選択し、残りの存続期間はそれを維持する必要があります。IsReadOnlyIsReadOnly
于 2012-10-01T08:28:48.237 に答える