为什么"Finalize方法不应该引用任何其他对象"?

mis*_*153 7 c# clr garbage-collection dispose finalizer

我一直在思考为什么我们建议,我们应该释放里面的finalize管理资源.如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx上看到代码示例,并搜索字符串"Dispose(bool disposing)在两个不同的场景中执行"并阅读评论,你会明白我的意思.

我能想到的唯一可能性是,它可能与无法预测何时调用终结器的事实有关.有谁知道正确的答案?

谢谢,误导

Jon*_*eet 11

如果您正在从终结器中引用另一个对象,则不知道对象是否已经完成 - 以及如果它完成,它将如何表现.(我不知道当前的CLR是否运行多个终结器线程,但另一个可怕的可能性是它在终结器运行时正在完成.)

在终结器中你需要做的就是释放你直接拥有的非托管资源.如果你引用了其他管理类型的自己的资源,让他们做他们的工作在他们的终结.

  • 只要对象*可达*,就不会被清除.如果您的对象正在最终确定,那么它是不可访问的,并且它所持有的任何引用都不是(因此不计算). (6认同)
  • @ mishal153:垃圾收集器识别三类对象:-1-其他活根对象可以访问的对象; -2-注册用于最终确定的对象,或者由任何其他实时根对象无法访问的对象; -3-根本无法到达的那些.第二类中的对象被添加到"立即终结"队列,该队列是一个有根对象,但不再被视为"可终结".从可终结对象可以访问对象的事实将防止它被扫除,但不会阻止它... (2认同)