一尘不染

在C#中使用IDisposable与析构函数有什么区别?

c#

什么时候在类而不是析构函数上实现IDispose?我读了这篇文章,但我仍然没有抓住重点。

我的假设是,如果我在对象上实现IDispose,则可以显式地“销毁”该对象,而不是等待垃圾回收器执行此操作。它是否正确?

这是否意味着我应该始终在对象上显式调用Dispose?常见的例子有哪些?


阅读 252

收藏
2020-05-19

共1个答案

一尘不染

终结器(也称为析构函数)是垃圾回收(GC)的一部分-
它不确定(何时(甚至)发生),因为GC主要是由于内存压力(例如,需要更多空间)而发生的。终结器通常仅用于清理 非托管
资源,因为托管资源将具有自己的收集/处置。

因此IDisposable用于 确定性地 清理对象,即现在。它不收集对象的内存(仍然属于GC),但是用于关闭文件,数据库连接等。

之前有很多主题:

最后,请注意,IDisposable对象也具有终结器并不罕见。在这种情况下,Dispose()通常调用GC.SuppressFinalize(this),这意味着GC不会运行终结器-
它只会丢弃内存(便宜得多)。如果您忘记了Dispose()该对象,则终结器仍将运行。

2020-05-19