私は、読み取り専用または非読み取り専用のカスタムコレクション実装を実装しています。つまり、コレクションを変更するすべてのメソッドは、道徳的に同等の関数を呼び出します。
private void ThrowIfReadOnly() {
if (this.isReadOnly)
throw new SomeException("Cannot modify a readonly collection.");
}
その場合、NotSupportedException
とInvalidOperationException
のどちらを使用すればよいかわかりません。
MSDNには、この正確なトピックについて NotSupportedException
に関するガイダンスが少しだけあります。
オブジェクトが要求された操作を実行できる場合があり、オブジェクトの状態によって操作を実行できるかどうかが決まるシナリオについては、「
InvalidOperationException
」を参照してください。
以下は、純粋に私自身のルールの解釈です。
InvalidOperationException
を使用する必要があります。NotSupportedException
を使用する必要があります。Dispose()
呼び出しの後でも、ObjectDisposedException
タイプを使用する必要があります。 (これはInvalidOperationException
のサブタイプです)。その場合のこれらのルールの実際の適用は次のようになります。
isReadOnly
は、オブジェクトが作成されたときにのみ設定でき(たとえば、コンストラクター引数)、それ以外のときに設定できない場合は、NotSupportedException
を使用する必要があります。isReadOnly
が変更される可能性がある場合は、InvalidOperationException
を使用する必要があります。InvalidOperationException
とNotSupportedException
のポイントは実際には重要ではありません-MSDNで IsReadOnly
の説明を考えると、 IsReadOnly
で許可されている動作は、コレクションが初期化された後でその値が変更されないことだけです。コレクションインスタンスは変更可能または読み取り専用のいずれかである可能性があることを意味しますが、初期化時に1つを選択し、残りの存続期間中それを維持する必要があります。