C#调用析构方法详解
在向大家详细介绍C#调用析构方法之前,首先让大家了解下C#中定义析构方法,然后全面介绍C#调用析构方法。
在C#中定义析构方法的格式是" ~CLASS_NAME() ".非常需要注意的是,如果一个类中没有使用到非托管资源,那么请一定不要定义析构方法,这是因为对象执行了析构方法,那么"垃圾回收器"在释放托管资源之前要先C#调用析构方法,然后第二次才真正释放托管资源,这样一来,两次删除动作的花销比一次大多的! (不过,即使你在类中已经定义了析构方法,仍然有办法"屏蔽"它,这将在后面的代码范例中说明) 在析构方法中,就是用户自己写的释放非托管资源的代码段.
下面使用一段代码来示范Dispose()方法和析构方法如何使用:
public class ResourceHolder : System.IDisposable { public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); // 上面一行代码作用是防止"垃圾回收器"调用这个类中的方法 // " ~ResourceHolder() " // 为什么要防止呢? 因为如果用户记得调用Dispose()方法,那么 // "垃圾回收器"就没有必要"多此一举"地再去释放一遍"非托管资源"了 // 如果用户不记得调用呢,就让"垃圾回收器"帮我们去"多此一举"吧 ^_^ // 你看不懂我上面说的不要紧,下面我还有更详细的解释呢! } protected virtual void Dispose(bool disposing) { if (disposing) { // 这里是清理"托管资源"的用户代码段 } // 这里是清理"非托管资源"的用户代码段 } ~ResourceHolder() { Dispose(false); } }
这里,我们必须要清楚,需要用户调用的是方法Dispose()而不是方法Dispose(bool),然而,这里真正执行释放工作的方法却并不是Dispose(),而是Dispose(bool) ! 为什么呢?仔细看代码,在Dispose()中,调用了Dispose(true),而参数为"true"时,作用是清理所有的托管资源和非托管资源;大家一定还记得我前面才说过,"使用析构方法是用来释放非托管资源的",那么这里既然Dispose()可以完成释放非托管资源的工作,还要析构方法干什么呢? 其实,析构方法的作用仅仅是一个"备份"!
相关推荐
chensen 2020-11-14
leihui00 2020-09-16
二十不悔三十而立 2020-08-19
shining0 2020-08-02
TyrionZK 2020-07-26
TreasureZ 2020-07-26
natloc 2020-07-19
Bonrui编程路 2020-07-18
TyrionZK 2020-07-18
TyrionZK 2020-07-04
TreasureZ 2020-06-25
TreasureZ 2020-06-20
TreasureZ 2020-06-16
jameszgw 2020-06-14
Bonrui编程路 2020-06-13
Bonrui编程路 2020-06-07