32

私は、読み取り専用または非読み取り専用のカスタムコレクション実装を実装しています。私はそのような場合に使用する必要がありますNotSupportedExceptionまたはInvalidOperationExceptionのかわからないですInvalidOperationExceptionまたはNotSupportedExceptionを使用するタイミングは?

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

:それは、コレクションを変更するすべてのメソッドは、の道徳的同等である関数を呼び出す、です。

答えて

43

MSDNのみNotSupportedExceptionに、この正確なトピックに関するガイダンスの1ビットを有する:オブジェクトが要求された操作を実行することが時として可能であり、オブジェクトの状態が動作するかどうかを判断するシナリオについて

を実行することができます。InvalidOperationExceptionを参照してください。

  • オブジェクトの状態は、操作がオブジェクトの存続期間中に有効/無効になることができるように変更することができるなら、InvalidOperationExceptionを使用する必要があります。次の何

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

  • オブジェクトの存続期間中に操作が常に無効/有効である場合は、NotSupportedExceptionを使用する必要があります。
  • この場合、「生涯」とは、誰でもオブジェクトへの参照を得ることができるすべての時間を意味します。つまり、Dispose()呼び出しの後でさえも、他のほとんどのインスタンスメソッドを使用できなくすることがあります。
    • Martin Liversageが指摘しているように、オブジェクトが処分されている場合は、より具体的にはObjectDisposedExceptionタイプを使用する必要があります。 (これはまだサブタイプInvalidOperationExceptionです)。
  • 次のように、その場合に、これらのルールの実用化は次のようになります

    • isReadOnlyのみオブジェクトが作成された時間(例えばコンストラクタ引数)に設定することができる場合、それ以外の場合は絶対に使用しないでください。NotSupportedExceptionを使用してください。
    • isReadOnlyがオブジェクトの存続期間中に変更できる場合は、InvalidOperationExceptionを使用する必要があります。
      • しかし、NotSupportedExceptionInvalidOperationExceptionのポイントは、コレクションを実装した場合の、実際に議論の余地がある - MSDN上IsReadOnlyの説明を与えられ、IsReadOnlyのための唯一の許可動作は、コレクションが初期化された後、その値が変化しないということです。つまり、コレクションインスタンスを変更可能または読み取り専用にすることができますが、それは初期化時に1つを選択し、残りの生涯にわたってそれに固執する必要があります。
    +5

    に配置されたオブジェクトのメソッドを呼び出すと、それは無効な操作であってもObjectDisposedException'代わりInvalidOperationException' 'の'スローする必要があります。 –

    +3

    @Martin:ああ、いいね!私は 'ObjectDisposedException'について全く知らなかった。(ObjectDisposedException'が 'InvalidOperationException'のサブタイプであると、' InvalidOperationException'の特別なケースであることにうまく対応します) –

    +0

    何かについて: bool SomeMethod(param){ if(ある状態のparam) いくつかの特定のチェックを返します。 if(ある状態Bのparam) 別の特定の検査を返します。 新しいNotSupportedException()をスローします。 } このメソッドを呼び出すときに他の可能性のある状態を追加した場合、開発者は3番目のifステートメントを追加する必要があります。したがって、メソッドの最後の行に到達する私には、サポートされていない例外です。どう思いますか? – Skychan

    関連する問題