析构函数是通过下面的形式声明的 [attributes] ~ identifier( ) { destructorbody } 其中 attributes(可选) 附加的声明性信息有关属性和属性类的更多信息请参见 C# 属性 identifier identifier 与类名相同 destructorbody 包含销毁类实例的语句的块 备注 不能对结构使用析构函数只能对类使用析构函数 一个类只能有一个析构函数 无法继承或重载析构函数 无法调用析构函数它们是被自动调用的 析构函数既没有修饰符也没有参数例如下面是类 MyClass 的析构函数的声明 ~ MyClass() { // Cleanup statements} 该析构函数隐式地对对象的基类调用 ObjectFinalize 方法这样前面的析构函数代码被隐式地转换为 protected override void Finalize(){ try { // Cleanup statements } finally { baseFinalize(); }} 这意味着对继承链中的所有实例递归地(从派生相近程度最大的到派生相近程度最小的)调用 Finalize 方法 程序员无法控制何时调用析构函数因为这由垃圾回收器决定的垃圾回收器检查是否存在应用程序不再使用的对象它认为这些对象符合销毁条件并回收这些对象占用的内存程序退出时也会调用析构函数 可以通过调用 GCCollect 方法强制进行垃圾回收但大多数情况下应避免这样做因为这样会导致出现性能问题有关更多信息请参见强制垃圾回收 示例 下面的示例创建三个类这三个类构成了一个继承链类 First 是基类Second 是从 First 派生的而 Third 是从 Second 派生的这三个类都有析构函数在 Main() 中创建了派生相近程度最大的类的实例程序运行时注意这三个类的析构函数会自动被调用并且是按照从派生相近程度最大的到派生相近程度最小的次序调用 // Destructorscsusing System;class First{ ~First() { ConsoleWriteLine(Firsts destructor is called); }}class Second: First{ ~Second() { ConsoleWriteLine(Seconds destructor is called); }}class Third: Second{ ~Third() { ConsoleWriteLine(Thirds destructor is called); }}public class MainClass { public static void Main() { Third myObject = new Third(); }} 输出 Thirds destructor is calledSeconds destructor is calledFirsts destructor is called 使用析构函数释放资源 一般来说您不必像使用 C++ 时那样关注内存管理这是因为 NET Framework 垃圾回收器会隐式地管理对象的内存分配和释放但是当应用程序封装窗口文件和网络连接这类非托管资源时应当使用析构函数释放这些资源当对象符合销毁条件时垃圾回收器会运行对象的 Finalize 方法 资源的显式释放 如果您的应用程序在使用昂贵的外部资源则还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式可通过实现 Dispose 方法(来自 IDisposable 接口)来完成这一点该方法为对象执行必要的清理这样可大大提高应用程序的性能即使有这种对资源的显式控制析构函数也是一种保护措施可用来在对 Dispose 方法的调用失败时清理资源 |