析构函数用于在类销毁之前释放类实例所使用的托管和非托管资源。对于C#应用程序所创建的大多数对象,可以依靠.NET Framework的垃圾回收器(GC)来隐式地执行内存管理任务。但若创建封装了非托管资源对象,在应用程序使用完这些非托管资源之后,垃圾回收器将运行对象的析构函数(即Finalize方法)来释放这些资源。
.NET Framework的垃圾回收器机制,GC能够自动的帮助我们释放资源。但我们一般不去手动的调用GC帮助我们回收,而是由程序自动的使用GC去回收资源。但有可能程序结束的时候,GC没有马上帮助我们去释放资源,如果你想让资源马上被释放的时候,就可以使用析构函数。
析构函数作用:帮助我们释放资源。当程序结束,你想让资源马上被释放的时候,就可以使用析构函数,如果你不使用析构函数的话,那么就由垃圾回收器来自动帮助我们释放资源。析构函数则是在垃圾回收、释放资源时使用的。
程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。 垃圾回收器检查是否存在应用程序不再使用的对象,如果垃圾回收器认为某个对象符合析构,则调用析构函数,并回收用来存储此对象的内存。 程序退出时也会调用析构函数。即当对象脱离其作用域时(例:对象所在的函数已调用完毕),系统自动执行析构函数。
如果用户没有编写析构函数,C#编译器会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。
定义析构函数的语法:
~类名()
{
语句块;
}
定义析构函数时需要注意以下几点:
1、只能对类使用析构函数,不能在结构体中定义析构函数。
2、一个类只能有一个析构函数。
3、无法继承或重载析构函数。
4、析构函数不允许有修饰符和参数。
5、无法显式地调用析构函数,因为析构函数是有垃圾回收器自动调用的。
代码示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Person { ~Person() //析构函数 { Console.WriteLine("小老弟,我是析构函数啊!我被调用了!!!"); } } }
该析构函数隐式地调用了基类Object的Finalize方法,上面代码中的析构函数将被隐式地转换为如下代码:
protected override void Finalize() { try { Console.WriteLine("小老弟,我是析构函数啊!我被调用了!!!"); } finally { base.Finalize(); //调用Object的Finalize方法 } }
文章评论