我正在实现一个可以只读或非读取的自定义集合实现;也就是说,所有改变集合的方法都会调用一个与道德等价的函数:
private void ThrowIfReadOnly() {
if (this.isReadOnly)
throw new SomeException("Cannot modify a readonly collection.");
}
我不确定在这种情况下我应该使用NotSupportedException
或InvalidOperationException
中的哪一个。
答案 0 :(得分:50)
MSDN在NotSupportedException
:
对于有时可能对象执行请求的操作并且对象状态确定是否可以执行操作的情况,请参阅
InvalidOperationException
。
以下内容纯粹是我对规则的解释:
InvalidOperationException
。NotSupportedException
。Dispose()
调用之后,通常会使大多数其他实例方法无法使用;
ObjectDisposedException
类型。 (这仍然是InvalidOperationException
)的子类型。这些规则在这种情况下的实际应用如下:
isReadOnly
只能在创建对象时设置(例如构造函数参数),并且从不在任何其他时间设置,则应使用NotSupportedException
。isReadOnly
在对象的生命周期内发生变化,则应使用InvalidOperationException
。
InvalidOperationException
vs NotSupportedException
在实现集合的情况下实际上没有实际意义 - 鉴于MSDN上IsReadOnly
的描述,{{1}的唯一允许行为在初始化集合后,它的值永远不会改变。这意味着集合实例可以是可修改的或只读的 - 但它应该在初始化时选择一个并在其生命周期的剩余时间内坚持使用它。