C#中finalizer和finally的区别

39 浏览
0 Comments

C#中finalizer和finally的区别

我正在学习c#中垃圾回收器的工作原理。我对DestructorDisposeFinalize方法的使用感到困惑。

根据我的研究和理解,将析构函数方法置于类中将告诉垃圾回收器按照析构函数方法中提到的方式进行垃圾收集,这不能在类的实例中显式调用。

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

我不确定是否理解得正确,请澄清疑问。欢迎提供更多链接或指南。

admin 更改状态以发布 2023年5月21日
0
0 Comments

在C#中,析构函数和终结器基本上是可互换的概念,并应在收集类型(例如外部处理程序)时用于释放非托管资源。很少需要编写终结器。

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

0
0 Comments

析构函数在技术上与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来强制进行垃圾回收,但大多数情况下应该避免这样做,因为它可能会导致性能问题。

0