csharp中的析构函数

析构函数

析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

以C++语言为例,析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

解构器

我们知道,‘解构器’被用来清除类的事例。当我们在C#中使用解构器是,我们必须记住以下几点:

  1. 一个类只能有一个解构器。
  2. 解构器不能被继承或重载。
  3. 解构器不能被调用。他们是自动被(编译器)调用的。
  4. 解构器不能带修饰或参数。

下面是类MyClass解构器的一个声明:

1
2
3
4
~ Class()
{
    //Cleaning up code goes here
}

程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的。垃圾收集器检查不在被应用程序使用的对象。它认为这些条件是符合清楚的并且收回它们的内存。解构器也在程序退出时被调用。当解构器执行时其背后所发生的那一幕是解构器隐式调用对象基类的Object.Finalize方法。因此上述解构器代码被隐含转化成:

1
2
3
4
5
6
7
8
9
10
11
protected override void Finalize()
{
    try
    {
       //Cleaning up.
    }
    finally
    {
       base.Finalize();
    }
}

使用完对象你就想调用解构器,该怎么做?有两个方法:

  1. 调用垃圾搜集器来清理GC.Collect();
  2. 实现IDisposable的Dispose方法。

尽管如此我们花费一些时间实现IDisposable接口,如果不能合适地调用它们会怎样?为此C#有一个酷的解决方案。‘using’代码块。它看起来像这样:

1
2
3
4
using (MyClass objCls =new MyClass())
{

}

https://www.cnblogs.com/paper/archive/2009/07/31/1535998.html