Ответ 1
У MSDN только один бит руководства по этой точной теме, NotSupportedException
:
Для сценариев, где иногда возможно, чтобы объект выполнил запрошенную операцию, и состояние объекта определяет, можно ли выполнить операцию, см.
InvalidOperationException
.
Далее следует только моя собственная интерпретация правила:
- Если состояние объекта может измениться, так что операция может стать недействительной/действительной во время жизни объекта, тогда следует использовать
InvalidOperationException
. - Если операция всегда недействительна/действительна в течение всего жизненного цикла объекта, то следует использовать
NotSupportedException
. - В этом случае "время жизни" означает "все время, когда кто-либо может получить ссылку на объект", то есть даже после вызова
Dispose()
, который часто делает большинство других методов экземпляра непригодными;- Как указывал Мартин Ливергаж, в случае объекта, который был удален, следует использовать более конкретный тип
ObjectDisposedException
. (Это все еще подтипInvalidOperationException
).
- Как указывал Мартин Ливергаж, в случае объекта, который был удален, следует использовать более конкретный тип
Практическое применение этих правил в этом случае будет следующим:
- Если
isReadOnly
можно установить только в момент создания объекта (например, аргумент конструктора) и никогда в любое другое время, тогда следует использоватьNotSupportedException
. - Если
isReadOnly
может меняться в течение всего жизненного цикла объекта, тогда следует использоватьInvalidOperationException
.- Тем не менее, точка
InvalidOperationException
противNotSupportedException
на самом деле спорным в случае реализации коллекции - данное описаниеisReadOnly
в MSDN, единственным допустимым поведением дляisReadOnly
является то, что его значение никогда не изменяется после инициализации коллекции. Это означает, что экземпляр коллекции может быть модифицируемым или доступным только для чтения, но он должен выбрать один при инициализации и придерживаться его на всю оставшуюся жизнь.
- Тем не менее, точка