C#中的析构函数用途是什么?

8
我有点困惑C#中析构函数的使用。据我所知,我们不能按照自己的意愿调用析构函数,它会在垃圾收集器自动调用之前对类(对象)执行一些工作,因此我想问如果我们在C#中使用析构函数,那么我们何时需要垃圾收集器?据我所知,析构函数可以处理内存,那么我们为什么需要垃圾收集器呢?
6个回答

14

到目前为止,这几乎是最好的答案,也是唯一正确的答案。在最好的情况下,您可以在终结器中调用Dipose(),以防其他代码没有手动调用Dispose()。 - siride
1
此外,Unmesh 提供的文章是一个非常好的资源,http://msdn.microsoft.com/en-us/magazine/cc163392.aspx。网络上有许多其他文章提到了 Dispose(bool disposing) 模式,但并没有解释“本地”和“托管”资源之间的区别。我曾经看到很多不必要地实现该模式以释放托管资源的类。 - Remus Rusanu
啊...我一直以为垃圾收集是收集垃圾,但其实应该把它看作是灭火。开玩笑的,我并不认为这篇文章真正有所帮助,更好的做法是将关闭流和文件视为业务逻辑需求而非资源需求(无论如何,最终还是由操作系统决定)。 - CurtainDog
在 C# 中关闭流和文件的任务属于 IDisposableusing 模式,而不是终结器和析构函数。 - Remus Rusanu
以上链接现在无法使用,有人能帮忙吗? - Radha Manohar

3

我认为根据您阅读的几乎重复的主题,您似乎并不了解垃圾回收器的工作原理。简单地说,它是自己在后台运行的服务,它跟踪和释放整个应用程序生命周期内未使用和已处理对象的内存。实际上,除非在非常罕见和特定的情况下,否则您永远不应该调用GC。

析构函数用于清理和释放无法由垃圾回收器释放的非托管资源,有关析构函数的更多信息,请参见此MSDN页面


1
+1 鼓励大声说出最好的建议可能是要提高他在 .NET 中关于内存管理、垃圾回收和本机资源/处理方面的知识。 - Jim Brissom

3

2
析构函数不是用于清理托管内存的,这是垃圾回收器负责的。析构函数是用于清理其他资源,例如句柄等。
我建议您查看 CLR via C# 以了解其工作原理的详细信息。

1

我认为这里的混淆来自于你可以确定性地和非确定性地处理对象(即当GC开始处理时)。

回答你关于为什么我们需要GC的问题,我会说,即使不考虑内存泄漏,GC也是相当高效的,而立即回收内存的要求实际上可能会降低系统的总体性能。这类似于单线程与多线程之争的论点。


0
在C#中,析构函数应该尽可能少地使用。然而,在某些情况下,你别无选择。
例如,如果你有一个用于记录日志的单例类,并且由于性能原因不能使用自动刷新,那么在单例的终结期间刷新缓冲区应该被考虑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接