在我的终结器中处理我的System.IDisposable对象

Har*_*lse 4 c# dispose idisposable finalizer

StackOverflow上有几个关于如果我的对象管理其他实现的托管对象该怎么做的讨论System.IDisposable.

注意:下面我不是在讨论非托管代码.我完全理解清理非托管代码的重要性

大多数讨论都说如果你的对象拥有另一个实现的托管对象System.IDisposable,那么你也应该实现System.IDisposable,在这种情况下你应该调用Dispose()你的对象所持有的一次性对象.这是合乎逻辑的,因为您不知道您拥有的一次性对象是否使用非托管代码.你只知道另一个对象的创造者认为如果你Dispose不再需要这个对象就打电话会是明智的.

在社区维基编辑的StackOverflow中给出了对Disposable模式的一个非常好的解释:

正确使用IDisposable接口

很多时候,我在上面提到的链接中读到:

"你不知道两个对象被销毁的顺序.完全有可能在你的Dispose()代码中,你试图摆脱的托管对象不再存在."

这让我感到困惑,因为我认为只要任何对象持有对象X的引用,那么对象X就不会也无法完成.

换句话说:只要我的对象持有对象XI的引用,就可以确定对象X没有最终确定.

如果这是真的,那么为什么会这样,如果我在完成之前持有对象的引用,我引用的对象已经完成了?

Jon*_*eet 5

真相介于两者之间:

  • 对象不能被垃圾收集,因此对象不再"存在"的可能性是不正确的
  • 当不再从其他非可终结对象引用对象时,可以最终确定对象.

如果对象X引用对象Y,但两者都是可终结的,则对象Y完全可能在对象X之前完成,或者甚至可以同时完成它们.

如果你的假设是正确的,那么你可以创建两个相互引用的对象(并具有终结器),并且它们永远不会被垃圾收集,因为它们永远不会被最终确定.