应该从属性get抛出ObjectDisposedException

时间:2013-08-05 23:36:42

标签: .net encapsulation idisposable

所以根据这个http://msdn.microsoft.com/en-us/library/system.objectdisposedexception.aspx ObjectDisposedException是:

  

对已处置对象执行操作时引发的异常。

因此,由于属性get不应该改变状态,因此它不是真正的“执行操作”。那么是否应抛出ObjectDisposedException然后有人访问已处置对象上的属性集?

2 个答案:

答案 0 :(得分:3)

在大多数情况下,处置对象的任何使用都是无效的。因此,抛出财产并不是不合理的。

话虽这么说,这可能会导致额外的开销,这可能足以阻止JIT对吸气剂进行内联,所以在实践中,如果吸气剂无论如何都会成功,可能不值得添加处置检查。如果属性getter将失败并在处理后抛出,那么我肯定会添加检查,因此异常将是有意义的并且与该类型无关。

  

因此,如果抛出ObjectDisposedException,那么有人会访问已处置对象上的属性集吗?

我绝对认为如果某个对象已被处置,则抛出属性 setter 是合适的。

答案 1 :(得分:0)

我建议如果在处理后使用某个对象,则抛出ObjectDisposedException的必要性并不是那么强大,因为没有这种使用的必要性导致任何其他异常。如果满足后一个要求需要一个对象确保在采取某些行动之前没有处置它,那么在不正确使用时抛出ObjectDisposedException可能基本上是“免费的”。另一方面,我不认为一个对象携带一个Disposed标志是不必要的,否则它不会关心它是否被处置(例如{{1}应该能够返回单Enumerable<T>.Empty.GetEnumerator()总是返回MoveNext()的单例枚举器实例,而不考虑它是否被处理掉。

相关问题