7

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

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

谢谢,米沙尔

4

2 回答 2

11

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

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

于 2010-04-22T06:32:04.077 回答
2

我认为你几乎一针见血。如果您查看Object.Finalize文档中的措辞,它会说:See the IDisposable interface for a complementary and more controllable means of disposing resources.“互补”的意思是“另一种方法”,并且可控的存在......正是您所说的。

编辑:Jon Skeet 所说的。多个终结器线程的概念确保我今晚不会睡觉或做噩梦。

于 2010-04-22T06:33:50.670 回答