C#析构函数
一,什么是析构函数?
在msdn中的解析:析构函数用于析构类的实例。
class A // 基类First { ~A() // 析构函数 { Console.WriteLine("~A()析构函数"); } }
特性:
1》不能在结构中定义析构函数。 只能对类使用析构函数。
2》一个类只能有一个析构函数。
3》无法继承或重载析构函数。
4》无法调用析构函数。 它们是被自动调用的。
5》析构函数既没有修饰符,也没有参数。
二,使用析构函数的有什么用?
一,程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。 垃圾回收器检查是否存在应用程序不再使用的对象。 如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。 程序退出时也会调用析构函数。
二,使用析构函数释放资源
通常,与运行时不进行垃圾回收的开发语言相比,C# 无需太多的内存管理。 这是因为 .NET Framework 垃圾回收器会隐式地管理对象的内存分配和释放。 但是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。 当对象符合析构时,垃圾回收器将运行对象的 Finalize 方法
三,那析构函数和构造函数有什么区别?先上代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace XigouMethod { class Program { static void Main(string[] args) { C c = new C(); // 创建类的实例 } class A // 基类First { ~A() // 析构函数 { Console.WriteLine("~A()析构函数"); } public A() { // 构造函数 Console.WriteLine("A()构造函数"); } } class B : A // B类从A类派生 { ~B() // 析构函数 { Console.WriteLine("~B()析构函数"); } public B() // 构造函数 { Console.WriteLine("B()构造函数"); } } class C : B // C类从B类派生 { ~C() // 析构函数 { Console.WriteLine("~C()析构函数"); } public C() // 构造函数 { Console.WriteLine("C()构造函数"); } } } }
结果:
四,总结:
1》程序运行时,这三个类的析构函数将自动被调用,调用顺序是按照从派生程度最大的(~C())到派生程度最小的(~A())次序调用的,和构造函数的调用顺序正好相反。则可以得出,当用户创建类的对象是调用构造函数,而当该对象已经调用完毕时,使用析构函数
2》析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
3》析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
4》析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~A( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。
4》如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。