Keep on going never give up.

Let's Go

C# 学习笔记(25)析构函数

C#Lonely2019-05-09 01:00:0034次0条

析构函数用于在类销毁之前释放类实例所使用的托管和非托管资源。对于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方法
    }
}





暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!