对象、类和结构(五)

本文介绍了C#中的析构函数概念及其使用方式。包括析构函数的特点、如何在类中声明和使用析构函数,以及如何通过析构函数来释放非托管资源等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

析构函数

析构函数用于析构类的实例

备注

l         不能在结构中定义析构函数。只能对类使用析构函数

l         一个类只能有一个析构函数

l         无法继承或重载析构函数

l         无法调用析构函数。它们是被自动调用的

l         析构函数既没有修饰符,也没有参数

 

例如,下面是类Car的析构函数的声明:

class Car

{

    ~ Car()  // destructor

    {

        // cleanup statements...

    }

}

该析构函数隐式地对对象的基类调用Finalize。这样,前面的析构函数代码被隐式地转换为:

protected override void Finalize()

{

       try

       {

              //cleanup statements…

}

finally

{

       base.Finalize();

}

}

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

注意:

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

程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。程序退出时也会调用析构函数。

可以通过调用Collect强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。

 

使用析构函数释放资源

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

 

资源的显式释放

如果您的应用程序在使用最昂贵的外部资源,则还建议您提供一种在垃圾回收器释放对象前显式地释放资源的方式。可通过实现来自IDisposable接口的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();
            }

    }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值