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()可以完成释放非托管资源的工作,还要析构方法干什么呢? 其实,析构方法的作用仅仅是一个"备份"!

c#

相关推荐