我对在c#中使用析构函数感到有点困惑。据我所知,我们不能打电话 析构函数根据我的意愿,它会在垃圾收集器之前自动调用,以便在类(对象)上执行一些工作,所以我想问一下我们是否在c#中使用析构函数然后我们需要垃圾收集器。我知道析构函数可以处理内存,那么为什么我们需要垃圾收集器?
答案 0 :(得分:14)
Everybody thinks about garbage collection the wrong way:
正确编写的程序不能 假设终结者将会运行。
答案 1 :(得分:3)
我认为基于阅读您的almost duplicate topic,您对垃圾收集器的工作原理并不了解。它是一种非常直率和简洁的方式,它是在后台运行的自己的服务,它在应用程序的整个生命周期中跟踪和释放未使用和处置的对象的内存。实际上,你应该从不自己打电话给GC,除非是非常罕见和具体的情况。
析构函数用于清理和释放垃圾收集器无法释放的非托管资源,有关析构函数的详细信息,请参阅此MSDN page。
答案 2 :(得分:3)
阅读有关实现IDisposable模式的正确方法也很有用。它比我们想象的要多得多 -
答案 3 :(得分:2)
析构函数不用于清理托管内存。这就是垃圾收集器的用途。析构函数用于清理其他资源,如句柄。
我建议您查看CLR via C#以了解其工作原理的详细信息。
答案 4 :(得分:1)
我认为这里的困惑来自于你可以确定性地和非确定性地处理对象(即当GC完成这样做时)。
为了回答你为什么我们需要GC的问题,我会说,即使放弃内存泄漏,GC也是非常高效的,并且要求立即回收内存实际上可能会降低系统的总体性能。它与单线程和多线程辩论类似。
答案 5 :(得分:0)
C#中的析构函数应该很少使用。但是,在某些情况下,你别无选择。
例如,如果你有一个用于记录的单例类,并且出于性能原因你不能使用autoflush,应该考虑在单例的最终确定期间刷新缓冲区。