c# - .NET 中的 Finalize 和 Dispose 方法有什么意义? (回答前详见)

标签 c# .net

我需要在对象拆卸期间清理资源,但我总能找到DisposeFinalize< 之间的区别/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/

相关文章:

c# - AutoFixture AutoMoq 不为某些属性创建模拟

c# - 尝试解析日期时出错

c# - 如何使用 FakeItEasy 伪造 Action <>

.net - UserControls 的构造函数中应该有 InitializeComponent 吗?

c# - 使用完整字符串路径打开注册表项

c# - 如果数据库表中不存在列,则排除或忽略实体模型的属性

c# - 使用 NPOI 将超链接从一个单元格复制到另一个单元格

c# - 将ASCII字符串转换为普通字符串C#

c# - 我可以仅将 .NET Core 与 F# 一起使用吗?还是我还需要学习 C#?

c# - 元组必须包含至少两个元素