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

Vic*_*jee 66 .net c# dispose destructor finalize

我正在研究垃圾收集器如何在c#中工作.我在使用的混乱Destructor,DisposeFinalize方法.

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

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

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

Hab*_*bib 58

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

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

析构函数隐式地在对象的基类上调用Finalize.

来自同一链接的示例:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

来自MSDN

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


Mar*_*ell 43

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

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

  • @VictorMukherjee再次,他们(析构者和终结者)是可以互换的.它是`Dispose()`,在*destroy之前被称为*,但它不被称为析构函数或终结符 (3认同)