【发布时间】:2015-09-29 14:20:46
【问题描述】:
关于如果我的对象管理其他实现 System.IDisposable 的托管对象时该怎么办,StackOverflow 上有几个讨论。
注意:下面我不是谈论非托管代码。我完全理解清理非托管代码的重要性
大多数讨论都说,如果您的对象拥有另一个实现System.IDisposable 的托管对象,那么您还应该实现System.IDisposable,在这种情况下,您应该调用您的对象持有的一次性对象的Dispose()。这是合乎逻辑的,因为您不知道您拥有的一次性对象是否使用非托管代码。您只知道另一个对象的创建者认为,一旦您不再需要该对象,就立即致电Dispose 是明智的。
StackOverflow 上对 Disposable 模式进行了很好的解释,由社区 wiki 编辑:
Proper use of the IDisposable interface
很多时候,在我读到的提到的链接中:
“您不知道销毁两个对象的顺序。完全有可能在您的
Dispose()代码中,您试图摆脱的托管对象不再存在。”
这让我很困惑,因为我认为只要任何对象持有对对象 X 的引用,那么对象 X 就不会也无法最终确定。
或者换句话说:只要我的对象持有对对象 X 的引用,我就可以确定对象 X 没有最终确定。
如果这是真的,那为什么会这样,如果我持有对我的对象的引用直到我完成,我引用的对象已经完成了?
【问题讨论】:
-
这就是我的理解:如果
Y拥有对X的唯一引用,但Y被孤立,那么Y和X都将被销毁。由于不保证顺序,所以X可以在Y之前销毁。 -
通常情况下,它比您想象的要复杂。我参考了 Eric Lippert 博客上的一篇文章,“Where Everything You Know is Wrong”。 ericlippert.com/2015/05/18/…
标签: c# dispose idisposable finalizer