C语言析构函数(C#)

 析构函数又称终结器,用于析构类的实例。

定义

  析构函数(destructor)
构造函数反倒,当指标结束其生命周期时(例如对象所在的函数已调用完毕),系统活动执行析构函数。析构函数往往用来做“清理善后”
的办事(例如在建立目的时用new开辟了一片内存空间,delete会自动调用析构函数后放走内存)。

 

 

析构函数简介

以C++语言为例:\[1\] 
析构函数名也应与类名相同,只是在函数名后边加一个位取反符~,例如~stud(),以界别于构造函数。它不可能带任何参数,也从没重返值(包括void类型)。只能有一个析构函数,不可能重载。如若用户并未编制析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也接连会为我们合成一个析构函数,并且只要自定义了析构函数,编译器在推行时会先调用自定义的析构函数再调用合成的析构函数),它也不举办其他操作。所以广大简易的类中从未用显式的析构函数。

 

 析构函数的使用


  • 不可能在构造中定义析构函数。只好对类使用析构函数。

  • 一个类只可以有一个析构函数。

  • 不知所可持续或重载析构函数。

  • 无法调用析构函数。它们是被活动调用的。

  • 析构函数既没有修饰符,也从来不参数。

 

声明:

class Car
{
    ~ Car()  // destructor
    {
        // cleanup statements...
    }
}

  该析构函数隐式地对目的的基类调用
Finalize.aspx)。这样,前边的析构函数代码被隐式地变换为:

protected override void Finalize()
{
    try
    {
        // cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

  这表示对继承链中的所有实例递归地调用 Finalize
方法(从派生程度最大的到派生程度最小的)。

注意

不应使用空析构函数。如果类包含析构函数,Finalize 队列中则会创建一个项。调用析构函数时,将调用垃圾回收器来处理该队列。如果析构函数为空,则只会导致不必要的性能丢失。

程序员不可以控制什么日期调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是不是留存应用程序不再采纳的靶子。要是垃圾回收器认为某个对象符合析构,则调用析构函数(假若有)并回收用来囤积此目标的内存。程序退出时也会调用析构函数。

可以通过调用
Collect.aspx)
强制举办垃圾回收,但大部分情状下应制止那样做,因为如此会导致性能问题有关更多新闻,请参见强制垃圾回收.aspx)。

 

 使用析构函数释放资源

 平时,与运行时不举行垃圾回收的编程语言相相比较,C#
无需太多的内存管理。这是因为 .NET Framework
垃圾回收器会隐式地管理对象的内存分配和释放。可是,当应用程序封装窗口、文件和网络连接这类非托管资源时,应当接纳析构函数释放这一个资源。当目标符合析构时,垃圾回收器将运行目的的
Finalize 方法。

 

资源的显式释放

比方你的应用程序在运用昂贵的外表资源,则还指出您提供一种在垃圾堆回收器释放对象前显式地释放资源的方法。可由此兑现来源
IDisposable.aspx)
接口的 Dispose
方法来成功这一点,该情势为目标实施必要的清理。这样可大大提高应用程序的习性。即便有这种对资源的显式控制,析构函数也是一种珍贵措施,可用来在对
Dispose 方法的调用退步时清理资源。

 

示例

上面的言传身教成立多少个类,那六个类构成了一个继承链。类
First 是基类,Second 是从 First 派生的,而 Third 是从 Second
派生的。这六个类都有析构函数。在 Main()
中,创建了派生程度最大的类的实例。注意:程序运行时,这多少个类的析构函数将自动被调用,并且是比照从派生程度最大的到派生程度最小的顺序调用。

class First
{
    ~First()
    {
        System.Console.WriteLine("First's destructor is called");
    }
}

class Second: First
{
    ~Second()
    {
        System.Console.WriteLine("Second's destructor is called");
    }
}

class Third: Second
{
    ~Third()
    {
        System.Console.WriteLine("Third's destructor is called");
    }
}

class TestDestructors
{
    static void Main() 
    {
        Third t = new Third();
    }
}