Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中析构函数的使用?_C#_.net_Destructor - Fatal编程技术网

c#中析构函数的使用?

c#中析构函数的使用?,c#,.net,destructor,C#,.net,Destructor,我对c#中析构函数的用法有点困惑。据我所知,我们不能打电话 析构函数根据我的愿望,它将在垃圾收集器之前自动调用,以便对类(对象)执行一些工作,因此我想问一下,我们是否在c#中使用析构函数,然后我们需要在什么时候调用垃圾收集器。我知道析构函数可以处理内存,那么为什么我们需要垃圾收集器呢?析构函数不是用来清理托管内存的。这就是垃圾收集器的作用。析构函数用于清理句柄等其他资源 我建议您查看有关如何工作的详细信息 我认为从阅读您的文章来看,您对垃圾收集器的工作原理没有很好的理解。简单明了地说,它是在后台

我对c#中析构函数的用法有点困惑。据我所知,我们不能打电话
析构函数根据我的愿望,它将在垃圾收集器之前自动调用,以便对类(对象)执行一些工作,因此我想问一下,我们是否在c#中使用析构函数,然后我们需要在什么时候调用垃圾收集器。我知道析构函数可以处理内存,那么为什么我们需要垃圾收集器呢?

析构函数不是用来清理托管内存的。这就是垃圾收集器的作用。析构函数用于清理句柄等其他资源


我建议您查看有关如何工作的详细信息

我认为从阅读您的文章来看,您对垃圾收集器的工作原理没有很好的理解。简单明了地说,它是在后台运行的自己的服务,它在应用程序的整个生命周期中跟踪并释放未使用和已处理对象的内存。实际上,除非在非常罕见和特殊的情况下,否则您永远不应该自己调用GC


Destructor用于清理和释放垃圾回收器无法释放的非托管资源,有关Destructor的更多信息,请参阅此部分。

了解实现IDisposable模式的正确方法也很有用。这比我们想象的要多得多-

正确编写的程序不能 假设终结器将永远运行


我认为这里的混淆源于这样一个事实,即您可以以确定性和非确定性的方式(即当GC开始处理对象时)处理对象

为了回答您关于为什么我们需要GC的问题,我想说的是,即使撇开内存泄漏不谈,GC的性能相当好,而且要求立即回收内存实际上可能会降低系统的总体性能。这与单线程与多线程的争论类似。

C#中的析构函数应该很少使用。然而,在某些情况下,你别无选择


例如,如果您有一个用于日志记录的单例类,并且出于性能原因,您不能使用自动刷新,那么应该考虑在单例的最终确定过程中刷新缓冲区。

+1几乎是迄今为止最好的答案,也是唯一真正正确的答案。充其量,您可以在终结器中调用Dipose(),以防程序中的其他代码没有手动调用Dispose()。此外,由Unmesh链接的文章是一个非常重要的资源。web上还有许多其他文章提到了
Dispose(bool disposing)
模式,实际上没有解释“本机”和“托管”资源之间的区别。我见过很多类不必要地实现了该模式来处理托管资源。。。在这里,我把垃圾收集看作是垃圾的收集,而我本应该把它看作是灭火。开玩笑的是,我不认为这篇文章真的有帮助,最好把关闭流和文件看作是一种业务逻辑需求,而不是一种资源需求(这最终取决于操作系统在任何情况下)。C#中的关闭流和文件职责属于
IDisposable
using
模式,不是终结器和析构函数。上面的链接现在不起作用,有人能帮我吗???+1大声说,最好的建议可能是在.NET中复习有关内存管理、垃圾收集和本机资源/处置的知识