您当前的位置: 首页 >  c#

Allen Su

暂无认证

  • 2浏览

    0关注

    431博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【C# 教程系列第 8 篇】什么是 c# 中的析构函数

Allen Su 发布时间:2019-01-16 22:34:49 ,浏览量:2

这是【C# 教程系列第 8 篇】,如果觉得有用的话,欢迎关注专栏。

上一篇博客我们讲了 什么是“构造函数” ,本篇博客写 C# 中的 析构函数

一:什么是析构函数?

先看如下代码所示

 	public class Toy
    {
        ~Toy()
        {
            
        }
    }

代码量少的应该会对这个 “~” 符号感到陌生,在 C# 中,析构函数用于释放被占用的系统资源。

使用析构函数时,应该注意下面的问题:

  • 析构函数是以 “~” 开头的。
  • 析构函数没有返回值,后紧跟类名,无参数。
  • 构造函数只能在类中使用,而且只能有一个析构函数。
  • 不能继承或重载析构函数。
  • 不能在代码中去调用析构函数,它是在资源被销毁时由运行时库调用,同时会调用 Object 类的 Finalize 方法。

针对最后一条通俗来讲就是,垃圾回收器决定了析构函数的调用,我们无法控制何时调用析构函数。 圾回收器检查是否存在应用程序不再使用的对象,如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。程序退出时会调用析构函数。

我们知道 .Net 中的所有类型都是从 Object 类派生的(下面的这段话我也是看了资料才知道的)

因此不管被定义的是类,还是结构,或者是其它数据类型,在这些类型的实例被销毁时都会调用公共基类 Object 类的 Finalize 方法。但是,由于 C# 编译器无法直接调用 Finalize 方法,所以在代码中无须直接重写 Finalize 方法,有兴趣的朋友可以参考 MSDN 文档上的说明来获取相关的内容,这点我就不深究了。

如果存在需要开发者手动进行清理的资源,除了使用析构函数,还有以下替代方案,如下代码所示

    class Speaker:IDisposable
    {
        public void Dispose()
        {
            //在此函数进行清理
        }
    }

我们在一个类后面实现 IDisposable 接口,在 Dispose 方法中写上自己的处理代码,怎么去用呢?和平常其实是一样的,如下代码所示

    Speaker sp=new Speaker();
    sp.Dispose();

当然,我们也可以把实现了 IDisposable 接口的类的实例写到一个 using 语句块中,当代码执行完成 using 语句块时会自动调用对象的 Dispose 方法,以释放占用的资源,如下代码所示

    using (Speaker sp=new Speaker())
    {
        //处理代码
    }

需要注意的是:这里的 using 语句和引入命名空间的 using 语句含义是不同的, 这里的 using 语句是限定一个范围,当代码执行到这个范围的结尾时会自动释放实现了 IDisposable 接口的对象实例。 当然,我们也可以通过调用 Collect 强制进行垃圾回收,不过最好不要这样做,因为这样做可能会导致性能问题。

构造函数与析构函数的区别 1:构造函数和析构函数是在类中说明的两种特殊的成员函数。 2:构造函数是在创建对象时,使用给定的值将对象初始化。 3:析构函数用于释放一个对象。在对象删除前,使用析构函数做一些清理工作,它与构造函数的功能正好相反。

“如何验证构造函数与析构函数” 的博客我已写好,有兴趣的可以看看。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。

结束语 技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。 最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
关注
打赏
1656491068
查看更多评论
立即登录/注册

微信扫码登录

0.0400s