析构函数的区别,配置和终结方法
我正在研究垃圾收集器如何在c#中工作。 我对使用Destructor
, Dispose
和Finalize
方法感到困惑。
根据我的研究和理解,在我的类中使用Destructor方法将告诉垃圾收集器按照析构函数方法中提到的方式执行垃圾收集,而该方法不能在类的实例上明确调用。
Dispose
方法旨在为用户提供控制垃圾回收的功能。 Finalize
方法释放类使用的资源,但不释放对象本身。
我不确定我是否以正确的方式理解它。 请澄清疑惑。 欢迎任何进一步的链接或指南。
析构函数隐含地调用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来强制垃圾收集,但大多数情况下,这应该避免,因为它可能会产生性能问题。
在C#术语中,析构函数和终结器基本上是可互换的概念,应该在收集类型时用于释放非托管资源,例如外部句柄。 你需要编写一个终结器是非常罕见的。
问题在于GC是非确定性的,所以Dispose()
方法(通过IDisposable
)可以支持确定性清理。 这与垃圾收集无关,并且允许调用者更快地释放任何资源。 它也适用于托管资源(除非托管),例如,如果您有一种封装(说)数据库连接的类型,则可能需要处置该类型以释放连接。
上一篇: Difference between destructor, dispose and finalize method