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

我什么时候在类上实现IDispose而不是析构函数? 我读过这篇文章,但我仍然忽略了这一点。

我的假设是,如果我在一个对象上实现IDispose,我可以明确地“销毁”它而不是等待垃圾收集器去做。 它是否正确?

这是否意味着我应该始终明确地在对象上调用Dispose? 这有什么常见的例子?


终结器(aka析构函数)是垃圾回收(GC)的一部分 - 当(或者甚至)发生这种情况时它是不确定的,因为GC主要是由于内存压力(即需要更多空间)而发生的。 终结器通常只用于清理非托管资源,因为管理资源将拥有自己的收集/处置。

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

有很多关于此的主题:

  • 确定性定稿
  • 处理物体
  • 使用块
  • 资源
  • 最后,请注意, IDisposable对象也有一个终结器并不少见; 在这种情况下, Dispose()通常会调用GC.SuppressFinalize(this) ,这意味着GC不会运行终结器 - 它只是抛出内存(更便宜)。 如果忘记Dispose()该对象,终结器仍会运行。


    Finalize()方法的作用是确保在收集垃圾时 .NET对象可以清理非托管资源。 但是,应该尽快释放诸如数据库连接或文件处理程序之类的对象,而不是依靠垃圾收集。 为此,您应该实现IDisposable接口,并在Dispose()方法中释放资源。


    唯一应该在C#析构函数中的是这一行:

    Dispose(False);
    

    而已。 在这种方法中,没有别的东西是应该的。

    链接地址: http://www.djcxy.com/p/54497.html

    上一篇: What is the difference between using IDisposable vs a destructor in C#?

    下一篇: Minimal IDisposable implimenation for managed resources only