Finalize() 和 Dispose()

引用:
http://www.7dspace.com/doc/24/0603/20063604160336160.htm
http://www.yesky.com/20030311/1656401_1.shtml
MSDN垃圾回收专题: http://msdn2.microsoft.com/zh-cn/library/0xy59wtx.aspx

一般在.NET程序中创建的托管对象,都是可以依靠GC来自动回收;但是当对象中封装了非托管资源时,就需要自己来释放。

对非托管资源的释放,可以通过Finalize()方法和IDisposable接口的Dispose()方法来实现。


Finalize()

* 析构函数会在编译时会被翻译为protected void Finalize(),这是C#的析构函数的语法

GC在回收对象之前会调用Finalize()来实现非托管资源的释放,不过按照MSDN的说法,Finalize()会导致性能的降低。

“垃圾回收器使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。每次您的应用程序创建具有 Finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。

  实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。当垃圾回收器执行回收时,它只回收没有终结器的不可访问对象的内存。这时,它不能回收具有终结器的不可访问对象。它改为将这些对象的项从终止队列中移除并将它们放置在标为准备终止的对象列表中。该列表中的项指向托管堆中准备被调用其终止代码的对象。垃圾回收器为此列表中的对象调用 Finalize 方法,然后,将这些项从列表中移除。后来的垃圾回收将确定终止的对象确实是垃圾,因为标为准备终止对象的列表中的项不再指向它们。在后来的垃圾回收中,实际上回收了对象的内存。” --[MSDN]


Dispose()

在Sytem.IDisposable接口中定义的方法。

使用Dispose()的规则:
1、首先,Dispose接口应该释放自身对象所占用的资源,还应该调用基类的Dispose方法,释放基类部分所占用的资源。

None.gif public   void  Dispose()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif 
// do something to release my unmanaged resource
InBlock.gif
 ReleaseMyResource();
InBlock.gif
InBlock.gif 
base.Dispose();
ExpandedBlockEnd.gif}

2、前面说过Finalize()会导致性能问题,那么在执行Dispose以后就应该告诉GC不用在调用Finalize()了

None.gif public   void  Dispose()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif 
// do something to release my unmanaged resource
InBlock.gif
 ReleaseMyResource();
InBlock.gif 
base.Dispose();
InBlock.gif
InBlock.gif 
// tell gc not to call Finalize()
InBlock.gif
 GC.SuppressFinalize(this);
ExpandedBlockEnd.gif}




 

转载于:https://www.cnblogs.com/netflu/archive/2006/06/07/419649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值