我实现自定义集合的实现,可以是只读或非只读; 也就是说,所有的改变集合调用一个函数是道德等价的方法:
private void ThrowIfReadOnly() {
if (this.isReadOnly)
throw new SomeException("Cannot modify a readonly collection.");
}
我不知道它的NotSupportedException
或InvalidOperationException
我应该在这种情况下使用。
在MSDN只有在这种精确制导的话题之一位,上NotSupportedException
:
对于场景中它有时是可能的对象来执行所请求的操作,并且对象状态确定是否可以执行的操作,请参阅InvalidOperationException
。
接下来纯粹是我自己的规则的解释:
- 如果对象的状态可以改变,这样的操作可以成为对象的生命周期过程中的无效/有效,则
InvalidOperationException
应该被使用。 - 如果整个对象的生命周期内的操作总是无效/有效的,那么
NotSupportedException
应该被使用。 - 在这种情况下,“终生”的意思是“整个时间,任何人都可以获取到对象的引用” -也就是,即使之后
Dispose()
调用,往往使得大多数其他实例方法不可用; - 如由Martin Liversage指出的那样,在一个对象的情况下,已被设置时,更具体
ObjectDisposedException
应使用类型。 (这仍然是一个亚型InvalidOperationException
)。
在这种情况下,这些规定的实际应用情况如下:
- 如果
isReadOnly
只能在时刻当对象被创建(例如,构造函数的参数),并且从未在任何其它时间设置,那么NotSupportedException
应该被使用。 - 如果
isReadOnly
可以在该对象的寿命期间改变,那么InvalidOperationException
应该被使用。 - 然而,点
InvalidOperationException
VS NotSupportedException
在执行一个集合的情况下,实际上是实际意义-给出的说明IsReadOnly
MSDN上,为唯一允许的行为IsReadOnly
是集合初始化后其值永远不会改变。 这意味着一个集合实例可以是修改或只读 - 但它应该选择一个在初始化,并且坚持使用其一生的其余部分。