析构函数
析构函数用于析构类的实例
备注
l 不能在结构中定义析构函数。只能对类使用析构函数
l 一个类只能有一个析构函数
l 无法继承或重载析构函数
l 无法调用析构函数。它们是被自动调用的
l 析构函数既没有修饰符,也没有参数
例如,下面是类Car的析构函数的声明:
class Car
{
~ Car() // destructor
{
// cleanup statements...
}
}
该析构函数隐式地对对象的基类调用Finalize。这样,前面的析构函数代码被隐式地转换为:
protected override void Finalize()
{
try
{
//cleanup statements…
}
finally
{
base.Finalize();
}
}
这意味着对继承链中的所有示例递归地调用Finalize方法(从派生程度最大的到派生程度最小的)。
注意:
不应使用空析构函数。如果类包含析构函数,Finalize队列中则会创建一个项。调用析构函数时,将调用垃圾回收器来处理该队列。如果析构函数为空,则只会导致不必要的性能丢失。
程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。程序退出时也会调用析构函数。
可以通过调用Collect强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。
使用析构函数释放资源
通常,与运行时不进行垃圾回收的编程语言相比,C#无需太多的内存管理。这是因为.NET Framework垃圾回收器会隐式地管理对象的内存分配和释放。但是,当应用程序封装窗口、文件和网络链接这类非托管资源时,应当使用析构函数释放这些资源。当对象符合析构时,垃圾回收器将运行对象的Finalize方法。
资源的显式释放
如果您的应用程序在使用最昂贵的外部资源,则还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。可通过实现来自IDisposable接口的Dispose方法来完成这一点,该方法为对象执行必要的清理。这样可大大提高应用程序的性能。即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对Dispose方法的调用失败时清理资源。
示例
下面的示例创建三个类,这三个类构成了一个继承链。类First是基类,Second是从First派生的,而Third是从Second派生的。这三个类都有析构函数。在Main()中,创建了派生程度最大的类的实例。注意:程序运行时,这三个类的析构函数将自动被调用,并且是按照从派生程度最大的到派生程度最小的次序调用。























