析构函数,处理和finalize方法之间的区别

时间:2012-12-21 10:25:46

标签: c# .net destructor dispose finalize

我正在研究垃圾收集器如何在c#中工作。我对使用DestructorDisposeFinalize方法感到困惑。

根据我的研究和理解,在我的类中使用Destructor方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集,该方法无法在类的实例上显式调用。

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

我不确定我是否以正确的方式理解它。请澄清疑虑。欢迎任何进一步的链接或指南。

2 个答案:

答案 0 :(得分:53)

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

您可能会看到:Destructors C# - MSDN

  

析构函数隐式调用了基类的Finalize   对象

来自同一链接的示例:

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

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

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

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

来自MSDN

  

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

答案 1 :(得分:41)

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

问题在于GC是非确定性的,因此Dispose()方法(通过IDisposable)可以支持确定性清理。这与垃圾收集无关,并允许调用者更快地释放的任何资源。它也适用于托管资源(除了非托管),例如,如果你有一个封装(比如说)数据库连接的类型,你可能需要处理也是要释放连接的类型。