我正在研究垃圾收集器在C#中的工作方式。我很困惑在使用Destructor
,Dispose
和Finalize
方法。
根据我的研究和理解,在我的类中具有Destructor方法将告诉垃圾收集器以destructor方法中提到的方式执行垃圾收集,而该方法不能在类的实例上显式调用。
该Dispose
方法旨在为用户提供控制垃圾收集的功能。该Finalize
方法释放类使用的资源,但不释放对象本身。
我不确定我是否理解正确。请澄清怀疑。欢迎任何其他链接或指南。
我正在研究垃圾收集器在C#中的工作方式。我很困惑在使用Destructor
,Dispose
和Finalize
方法。
根据我的研究和理解,在我的类中具有Destructor方法将告诉垃圾收集器以destructor方法中提到的方式执行垃圾收集,而该方法不能在类的实例上显式调用。
该Dispose
方法旨在为用户提供控制垃圾收集的功能。该Finalize
方法释放类使用的资源,但不释放对象本身。
我不确定我是否理解正确。请澄清怀疑。欢迎任何其他链接或指南。
Answers:
析构函数隐式调用Finalize方法,它们在技术上是相同的。处置可用于实现IDisposable接口的对象。
您可能会看到:析构函数C#-MSDN
析构函数在对象的基类上隐式调用Finalize。
来自同一链接的示例:
class Car
{
~Car() // destructor
{
// cleanup statements...
}
}
析构函数的代码隐式转换为以下代码:
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}
您对Destructor的理解是正确的:
从MSDN
的程序员时,因为这是由垃圾收集器确定的析构函数被称为无法控制。垃圾收集器检查应用程序不再使用的对象。如果认为某个对象符合销毁条件,它将调用析构函数(如果有)并回收用于存储该对象的内存。程序退出时也会调用析构函数。可以通过调用Collect强制进行垃圾回收,但是在大多数情况下,应避免这种情况,因为这可能会导致性能问题。
用C#术语来说,析构函数和终结器基本上是可互换的概念,并应在收集类型(例如外部句柄)时用于释放非托管资源。这是非常罕见的,你需要写一个终结。
这样做的问题是GC是不确定的,因此该Dispose()
方法(通过IDisposable
)可以支持确定性清除。这与垃圾回收无关,并且允许调用者更快地释放任何资源。它也适用于托管资源(除了非托管资源之外),例如,如果您具有封装(例如)数据库连接的类型,则可能还希望处置该类型以释放连接。
Dispose()
会被调用的,但不会被称为析构函数或终结器
Collect()
可能会导致性能问题?