对于您的 应用程序 创 建的大多数 对象,可以依靠 .NET Framework 的垃圾回收器 隐 式地 执行所有必
要的内存管理任 务。但是, 在您 创建封装非托管 资源的 对象时,当您在 应用程序中使用完 这些非托
管资源之后, 您必 须显 式地 释 放它 们。最常 见的一 类 非托管 资源就是包装操作系 统资 源的 对 象,例
如文件、 窗口或网 络连 接。虽 然垃圾回收器可以跟踪封装非托管 资源的 对象的生存期, 但它不了解
具体如何清理 这些资 源。 对于这些类型的 对象, .NET Framework 提供 Object .Finalize 方法,它
允许对 象在垃圾回收器回收 该对 象使用的内存 时适当清理其非托管 资源。默认情况下,Finalize 方
法不 执行任何操作。 如果您要 让垃圾回收器在回收 对象的内存之前 对对 象执 行清理操作, 您必 须在
类中重写 Finalize 方法。
说明:
若要在 C# 中实现 Finalize 方法,您必须使用 析构函数语法 。在 .NET Framework 2.0 版中,
Visual C++ 为实现 Finalize 方法提供了自己的语法,详见 Destructors and Finalizers in
Visual C++ 中的介绍。在 .NET Framework 1.0 版和 1.1 版中, Visual C++ 与 C# 一样,也
对 Finalize 方法使用析构函数语法。
垃圾回收器使用名为 “终止队列” 的内部结构跟踪具有 Finalize 方法的对象。 每次您的应用程序
创建具有 Finalize 方法的对象时, 垃圾回收器都在终止队列中放置一个指向该对象的项。 托管堆
中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。
说明:
为 GC. KeepAlive 方法提供的代码示例演示攻击性垃圾回收如何会导致终结器在已回收的对
象的成员仍在执行时运行,以及如何使用 KeepAlive 方法来阻止这种情况的发生。
Finalize 方法不应引发异常,因为应用程序无法处理这些异常,而且这些异常会导致应用程序终
止。
实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用
Finalize 方法回收对象使用的内存需要至少两次垃圾回收。当垃圾回收器执行回收时,它只回收
没有终结器的不可访问对象的内存。 这时, 它不能回收具有终结器的不可访问对象。 它改为将这些