析构函数的区别,configuration和终结方法

我正在研究垃圾收集器如何在C#中工作。 我对使用DestructorDisposeFinalize方法感到困惑。

根据我的研究和理解,在我的类中有一个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#术语来说,析构函数和终结器基本上是可以互换的概念,并且应该用于在收集types时释放非托pipe资源,例如外部句柄。 这是非常罕见的,你需要写一个终结者。

问题在于GC是非确定性的,所以Dispose()方法(通过IDisposable )使支持确定性清理成为可能。 这与垃圾收集无关,并允许调用者更快地释放任何资源。 它也适用于托pipe资源(除非托pipe),例如,如果您有一个封装 (说)数据库连接的types,则可能需要处理该types以释放连接。