析构函数当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。
析构函数用于析构类的实例。
备注
-
不能在结构中定义析构函数。只能对类使用析构函数。
-
一个类只能有一个析构函数。
-
无法继承或重载析构函数。
-
无法调用析构函数。它们是被自动调用的。
-
析构函数既没有修饰符,也没有参数。
例如,下面是类 Car
的析构函数的声明:
class Car
{
~ Car() // destructor
{
// cleanup statements...
}
}
该析构函数隐式地对对象的基类调用 Finalize。这样,前面的析构函数代码被隐式地转换为:
protected override void Finalize()
{
try
{
// cleanup statements...
}
finally
{
base.Finalize();
}
}
这意味着对继承链中的所有实例递归地调用 Finalize
方法(从派生程度最大的到派生程度最小的)。使用空析构函数,Finalize
队列中则会创建一个项,会导致不必要的性能丢失。
资源的显式释放
如果您的应用程序在使用昂贵的外部资源,则还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。可通过实现来自 IDisposable 接口的 Dispose
方法来完成这一点,该方法为对象执行必要的清理。这样可大大提高应用程序的性能。即使有这种对资源的显式控制,析构函数也是一种保护措施,可用来在对 Dispose
方法的调用失败时清理资源。
清理非托管资源
-
1.实现 Dispose 方法
-
描述用于释放非托管资源的 Dispose 方法的实现。
-
2.重写 Finalize 方法
-
描述 Finalize 和 Dispose 方法的合作方式。
-
3.C# 与 C++ 中的析构函数语法
-
描述 Finalize 方法在 C# 和 C++ 中的等效方法
-
4.使用封装资源的对象
-
描述确保 Dispose 方法得到调用的方式,例如 C# using 语句(在 Visual Basic 中为 Using)。