这是【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:析构函数用于释放一个对象。在对象删除前,使用析构函数做一些清理工作,它与构造函数的功能正好相反。
“如何验证构造函数与析构函数” 的博客我已写好,有兴趣的可以看看。
你的问题得到解决了吗?欢迎在评论区留言。
赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。
结束语 技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。 最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。