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

时间:2010-04-22 06:26:38

标签: c# garbage-collection clr dispose finalizer

我一直在思考为什么建议我们在finalize中发布托管资源。 如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx看到代码示例,并搜索字符串“Dispose(bool disposing)在两个不同的场景中执行”并阅读该评论,您将理解我的意思。

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

感谢, 米沙勒

2 个答案:

答案 0 :(得分:11)

如果您从终结器中引用另一个对象,则不知道 对象是否已经完成 - 以及 最终确定后它的行为方式。 (我不知道当前的CLR是否运行多个终结器线程,但另一个可怕的可能性是它在终结器运行时正在完成。)

您需要在终结器中执行的只是释放您直接拥有的非托管资源。如果您正在引用拥有资源的其他托管类型,请让他们在他们的终结器中完成工作。

答案 1 :(得分:2)

我认为你几乎已经击中了头部。如果你看一下Object.Finalize文档中的措辞,它会说:See the IDisposable interface for a complementary and more controllable means of disposing resources.“补充”意思,“另一种方式”,可控制的......正是你所说的。

编辑:Jon Skeet说的话。多个终结器线程的概念确保我今晚不会睡觉,或者有非常糟糕的梦想。