内存回收,Dispose,Close,Finalie(C#中的析构函数)


.NET中的资源分托管和非托管,所谓的托管是指CLR(通用语言运行时)中进行管理的资源,它可以由CLR自动进行内存回收.
也就是大家熟知的GC(垃圾回收机制).
而对于 非托管资源,比如数据库连接,COM连接等,那么需要手动清理回收资源.
清理非托管资源,我们可以用析构函数来执行,虽然它的执行时机不确定,但终究会被执行.
当然还有Dispose()和Close()方法,两者的区别在于,Close()后还要以用Open()打开,而Dispose()则是彻底销毁.

---
使用析构函数时,需要GC.Collect()才会执行到(GC,Collect()在自动回收机制中会自动执行,也可以显式调用它)
而Dispose()需要显式地调用,或者使用using()
,但是,需要注意:在用析构函数时,至少分两步走:调用函数,回收内存.
那么,在用using()或*.Dispose()后,GC还会再去执行析构函数.
因此,在Dispose()里,加上GC.SupressFinalize(this)来防止再次调用析构函数.

总结:
Dispose()和Close()需要显示调用,Dispose()可以通过using()调用.析构函数无法显式调用.
Dispose()和析构函数是销毁对象,而Close()是关闭,可以通过Open()再开.
析构函数调用时机不确定,而Dispose()在显式或Using()时执行,Close()在显式时执行.
三者都是用来销毁非托管对象.
一段经典的C#-Dispose:
 1 None.gif private   bool  _isDisposed = false ;
 2 None.gif ~ MyTest()
 3 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 4InBlock.gif            //this.Close();
 5InBlock.gif            Dispose(false);
 6ExpandedBlockEnd.gif        }

 7 ExpandedBlockStart.gifContractedBlock.gif         /**/ /// <summary>
 8InBlock.gif        /// 内存释放,需要此类实例显式调用,如sql.Dispose();或Using()
 9ExpandedBlockEnd.gif        /// </summary>

10 None.gif          public   void  Dispose()
11 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
12InBlock.gif            //IDisposable dispose = this as IDisposable;
13InBlock.gif            //if(dispose!=null)
14InBlock.gif            //{
15InBlock.gif            //    dispose.Dispose();
16InBlock.gif            //}
17InBlock.gif            Dispose(true);
18InBlock.gif            GC.SuppressFinalize(this);
19ExpandedBlockEnd.gif        }

20 None.gif         protected   virtual   void  Dispose( bool  disposing)
21 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
22InBlock.gif            if(!_isDisposed)
23ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
24InBlock.gif                if(disposing)
25ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
26InBlock.gif               //托管资源的释放    
27ExpandedSubBlockEnd.gif                }

28InBlock.gif               //非托管资源的释放
29InBlock.gif                _isDisposed = true;
30ExpandedSubBlockEnd.gif            }

31ExpandedBlockEnd.gif        }

转载于:https://www.cnblogs.com/godwar/archive/2008/07/29/1255663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值