博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
析构函数(C#)
阅读量:5875 次
发布时间:2019-06-19

本文共 2012 字,大约阅读时间需要 6 分钟。

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

定义

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

 

 

析构函数简介

以C++语言为例:
[1]   析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于 。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能 。如果用户没有编写析构函数, 会自动生成一个缺省的析构函数(即使自定义了析构函数, 也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

 

 析构函数的使用

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

  • 一个类只能有一个析构函数。

  • 无法继承或重载析构函数。

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

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

 

声明:

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

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

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

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

Note注意

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

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

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

 

 使用析构函数释放资源

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

 

资源的显式释放

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

 

 

转载于:https://www.cnblogs.com/lsy131479/p/8241186.html

你可能感兴趣的文章
Linux 中如何通过命令行访问 Dropbox
查看>>
开发进度——4
查看>>
JS里验证信息
查看>>
Akka actor tell, ask 函数的实现
查看>>
windows10 chrome 调试 ios safari 方法
查看>>
Netty 4.1.35.Final 发布,经典开源 Java 网络服务框架
查看>>
详解Microsoft.AspNetCore.CookiePolicy
查看>>
SCDPM2012 R2实战一:基于SQL 2008 R2集群的SCDPM2012 R2的安装
查看>>
SQL SERVER中字段类型与C#数据类型的对应关系
查看>>
Linux lsof命令详解
查看>>
SVG path
查看>>
js判断checkbox是否选中
查看>>
多系统盘挂载
查看>>
MySQL函数怎么加锁_MYSQL 函数调用导致自动生成共享锁问题
查看>>
MR1和MR2的工作原理
查看>>
Eclipse中修改代码格式
查看>>
GRUB Legacy
查看>>
关于 error: LINK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案...
查看>>
python实现链表
查看>>
java查找string1和string2是不是含有相同的字母种类和数量(string1是否是string2的重新组合)...
查看>>