我正在研究垃圾收集器如何在 c# 中工作。Destructor
我对,Dispose
和Finalize
方法的使用感到困惑。
根据我的研究和理解,在我的类中有一个 Destructor 方法将告诉垃圾收集器以析构方法中提到的方式执行垃圾收集,而不能在类的实例上显式调用。
该Dispose
方法旨在为用户提供对垃圾收集的控制。该Finalize
方法释放了类使用的资源,但不释放对象本身。
我不确定我是否以正确的方式理解它。请澄清疑惑。欢迎任何进一步的链接或指南。
我正在研究垃圾收集器如何在 c# 中工作。Destructor
我对,Dispose
和Finalize
方法的使用感到困惑。
根据我的研究和理解,在我的类中有一个 Destructor 方法将告诉垃圾收集器以析构方法中提到的方式执行垃圾收集,而不能在类的实例上显式调用。
该Dispose
方法旨在为用户提供对垃圾收集的控制。该Finalize
方法释放了类使用的资源,但不释放对象本身。
我不确定我是否以正确的方式理解它。请澄清疑惑。欢迎任何进一步的链接或指南。
析构函数隐式调用 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()
方法 (via IDisposable
) 可以支持确定性清理。这与垃圾回收无关,并允许调用者更快地释放任何资源。它也适用于托管资源(除了非托管资源),例如,如果您有一个封装(例如)数据库连接的类型,您可能也希望处理该类型以释放连接。