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

标签 c# dispose idisposable finalizer

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

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

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

StackOverflow 上对 Disposable 模式给出了很好的解释,由社区 wiki 编辑:

Proper use of the IDisposable interface

经常,而且在提到的链接中我读到:

"You don't know the order in which two objects are destroyed. It is entirely possible that in your Dispose() code, the managed object you're trying to get rid of is no longer there."

这让我感到困惑,因为我认为只要任何对象持有对对象 X 的引用,那么对象 X 就不会也不能被终结。

或者换句话说:只要我的对象持有对对象 X 的引用,我就可以确定对象 X 未完成。

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

最佳答案

事实介于两者之间:

  • 该对象无法被垃圾回收,因此该对象不再“存在”的可能性不成立
  • 当不再有来自其他不可终结对象的任何引用时,一个对象可以被终结。

如果对象 X 引用对象 Y,但两者都是可终结的,那么对象 Y 完全有可能在对象 X 之前终结,甚至它们可以同时终结。

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

关于c# - 在我的终结器中处理我的 System.IDisposable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31781415/

相关文章:

c# - 在 C# 中使用 IDisposable 与析构函数有什么区别?

c# - 使用 ObservableAsPropertyHelper 激活/停用

c# - using语句用法

c# - 如何确保在资源上使用 using 关键字

C#:如何翻译 Yield 关键字

c# - 尽可能最快的绘图、笔分配和 if 语句

java - 关闭窗口 - 但不要停止程序 - JAVA

c# - 如何在 WPF 中使用一次性 View 模型?

c# - 如何将实体从一个 Entity Framework 上下文复制到另一个 Entity Framework 上下文?

c# - 连接 DataTable 中两列的值