析构函数、dispose和finalize方法的区别

本文关键字:方法 区别 finalize dispose 析构函数 | 更新日期: 2023-09-27 17:49:14

我正在学习c#中的垃圾收集器是如何工作的。我对Destructor, DisposeFinalize方法的使用感到困惑。

根据我的研究和理解,在我的类中有一个析构方法将告诉垃圾收集器以析构方法中提到的方式执行垃圾收集,而析构方法不能在类的实例上显式调用。

Dispose方法旨在为用户提供控制垃圾收集的功能。Finalize方法释放类使用的资源,但不释放对象本身。

我不确定我是否理解对了。请澄清疑点。欢迎提供更多的链接或指南

析构函数、dispose和finalize方法的区别

Destructor隐式调用Finalize方法,它们在技术上是相同的。Dispose可用于实现IDisposable接口的对象。

你可以看到:c# - MSDN

类的基类上隐式调用Finalize对象。

来自同一链接的示例:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

析构函数的代码隐式地转换为以下代码:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

你对析构函数的理解是正确的:

从MSDN

程序员无法控制何时调用析构函数因为这是由垃圾收集器决定的。垃圾收集器检查不再被使用的对象应用程序。如果它认为一个物体有资格销毁,它调用析构函数(如果有的话)并回收用于存储的内存对象。当程序退出时也调用析构函数。它是可以通过调用Collect来强制垃圾收集,但大多数情况下在这种情况下,应该避免这样做,因为它可能会影响性能问题。

在c#术语中,析构函数和终结器基本上是可互换的概念,应该用于在收集类型时释放非托管资源,例如外部句柄。很少需要编写终结器。

问题是GC是非确定性的,所以Dispose()方法(通过IDisposable)使得支持确定性的清理成为可能。这与垃圾收集无关,并且允许调用者更快地释放任何资源。它也适合与托管资源一起使用(除了非托管),例如,如果您有一个封装的类型(例如)数据库连接,那么您可能也希望处置该类型以释放连接。