我需要在对象拆卸期间清理资源,但我总能找到Dispose、Finalize< 之间的区别/em>,以及析构方法有点困惑。
我发现了这篇很棒的文章,它简明扼要地描述了它们之间的区别,我必须保存它以备将来引用:
"Difference between Destructor, Dispose and Finalize methods" - Sanjay Saini
http://sanjaysainitech.blogspot.com/2007/06/difference-between-destructor-dispose.html
我想问的基本问题是这个。
If a language offers destructors (for example C# [refuted]) what value do Dispose and Finalize add to the equation?
我只是一个脾气暴躁的人,习惯了在析构函数中做所有事情的老派方式,还是我遗漏了一些只有通过将对象分解为三个部分才能实现的东西?
更新:
正如一些回复中所指出的,C# 实际上没有析构函数。认识到这一点,这个问题在这一点上可能没有实际意义。当我在上面引用的文章中读到 C# 实际上有一个单独的析构函数(显然是一个错误)时,它让我陷入了循环,我开始想知道如果你有一个最终的析构函数来包装所有东西, Dispose 和 Finalize 的意义是什么.我想在像 C# 这样的 GC 语言中,为对象提供卸载的单个析构函数的概念没有多大意义。
很抱歉对你们中的一些人投了反对票,但有几个人没有仔细阅读问题并认为我在问 Dispose 和 Finalize 之间的区别,这真的不是重点。
最佳答案
那篇博文的作者有点困惑...
在 C# 中,没有“析构函数”这样的东西。只有终结器和 IDisposable。
~ClassName() 方法不称为“析构函数”。它被称为终结器。
Dispose 的存在是为了从代码中释放资源,其中终结器的存在是为了从 GC 中调用。通常,终结器调用 Dispose() 方法,但 "Dispose Pattern"将您设置为仅处理来自终结器的非托管资源。
你看,当终结器被调用时,你在不同的线程上,你拥有的任何托管对象都不一定有效。因此,如果您从终结器调用 Dispose(),您实际上应该调用 Dispose(false),它告诉“Dispose 模式”仅处理非托管资源。
此外,"Dispose Pattern"建议在调用 Dispose(true) 时,您应该抑制该对象的终结器。
关于c# - .NET 中的 Finalize 和 Dispose 方法有什么意义? (回答前详见),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/752792/