我需要在拆卸对象期间清理资源,但我总是发现 Dispose Finalize 和析构函数方法之间的差异有点令人困惑。

我发现这篇很棒的文章简洁地描述了它们之间的区别,我将不得不保存以备将来引用:
"Difference between Destructor, Dispose and Finalize methods" - Sanjay Saini
http://sanjaysainitech.blogspot.com/2007/06/difference-between-destructor-dispose.html

我想在这里提出的基本问题是这个。



我只是一个习惯于在析构函数中做所有事情的老派方式的脾气暴躁的人,还是我缺少的东西只有通过将对象的拆卸分成三个部分才能实现?

更新:
正如一些回复中所指出的,C# 实际上没有析构函数。认识到这一点,这个问题在这一点上可能没有实际意义。当我在上面引用的文章中读到 C# 实际上有一个单独的析构函数(显然是一个错误)时,它让我陷入了一个循环,我开始想知道如果你有一个最终的析构函数来结束一切,那么 Dispose 和 Finalize 的意义是什么.我想在像 C# 这样的 GC 语言中,单个析构函数为对象提供 denemount 的概念没有多大意义。

很抱歉对你们中的一些人投了反对票,但有几个人没有仔细阅读这个问题,并认为我在问 Dispose 和 Finalize 之间的区别,这真的不是重点。

最佳答案

那篇博文的作者有点困惑......

在 C# 中,没有“析构函数”这样的东西。只有终结器和 IDisposable。

~ClassName() 方法不被称为“析构函数”。它被称为终结器。

Dispose 存在以从代码中释放资源,其中终结器存在以从 GC 中调用。通常,终结器调用 Dispose() 方法,但 "Dispose Pattern" 将您设置为仅处理来自终结器的非托管资源。

你看,当终结器被调用时,你在一个不同的线程上,你拥有的任何托管对象不一定有效。正因为如此,如果你从终结器调用 Dispose(),你真的应该调用 Dispose(false),它告诉“处置模式”只处置非托管资源。

此外,"Dispose Pattern" 建议当调用 Dispose(true) 时,您应该取消该对象上的终结器。

关于c# - .NET 中的 Finalize 和 Dispose 方法有什么意义? (回答前请看详情),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/752792/

10-16 05:10