我一直在思考为什么不建议在finalize里面释放托管资源。如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx看到代码示例,并搜索字符串“Dispose(bool disposing) 在两个不同的场景中执行”并阅读评论,你会明白我的意思。
我能想到的唯一可能性是,它可能与无法预测何时调用终结器这一事实有关。有谁知道正确答案?
谢谢,米沙尔
我一直在思考为什么不建议在finalize里面释放托管资源。如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx看到代码示例,并搜索字符串“Dispose(bool disposing) 在两个不同的场景中执行”并阅读评论,你会明白我的意思。
我能想到的唯一可能性是,它可能与无法预测何时调用终结器这一事实有关。有谁知道正确答案?
谢谢,米沙尔
如果您从终结器引用另一个对象,您不知道该对象是否已经被终结——以及如果它被终结,它将如何表现。(我不知道当前的 CLR 是否运行多个终结器线程,但另一个可怕的可能性是,当你的终结器运行时,它正在被终结的过程中。)
在终结器中您需要做的就是释放您直接拥有的非托管资源。如果您要引用其他拥有资源的托管类型,请让它们在终结器中完成工作。
我认为你几乎一针见血。如果您查看Object.Finalize文档中的措辞,它会说:See the IDisposable interface for a complementary and more controllable means of disposing resources.
“互补”的意思是“另一种方法”,并且可控的存在......正是您所说的。
编辑:Jon Skeet 所说的。多个终结器线程的概念确保我今晚不会睡觉或做噩梦。