国产美女一级毛片精品久久久|婷婷影院在线综合免费视频|最新国产午夜精品视频成人|久久精品九九无码免费

如何清理C#.Net中的非托管代碼?

來(lái)源:北大青鳥飛迅校區(qū)|發(fā)布時(shí)間:2013-04-17 10:06:08

  如何清理C#.Net中的非托管代碼?最近幫助其它項(xiàng)目組Review代碼,發(fā)現(xiàn)有些地方實(shí)現(xiàn)了IDispose接口,同時(shí)也發(fā)現(xiàn)了一些關(guān)于IDispose的問(wèn)題:

  1、A類型實(shí)現(xiàn)了IDispose接口,B類型里面含有A類型的字段,B類型沒(méi)有實(shí)現(xiàn)IDispose接口。

  2、一個(gè)類里面實(shí)現(xiàn)了Finalize終結(jié)器,同時(shí)也實(shí)現(xiàn)了IDispose接口,但在Dispose方法里面沒(méi)有調(diào)用GC.SuppressFinalize(this)方法。

  下面我對(duì)以上兩個(gè)問(wèn)題分別分析一下,并提出解決方案。

  問(wèn)題1

  如果A類型里面有非托管資源需要在實(shí)現(xiàn)的IDispose接口里面釋放,由于B類型沒(méi)有實(shí)現(xiàn)IDispose接口,B類型的使用者要想釋放A類型的非托管資源并不方便.這樣的話,就有可能忘記了釋放A類型的非托管資源。

  解決方案:

  實(shí)現(xiàn)B類型的IDispose接口,在Dispose方法里面調(diào)用A類型的Dispose方法.這樣,B類型的使用者在調(diào)用B類型Dispose的同時(shí),就把A類型的Dispose也調(diào)用了。

  問(wèn)題2

  在Dispose方法里面沒(méi)有調(diào)用GC.SuppressFinalize(this)方法,會(huì)有什么問(wèn)題呢,這樣會(huì)導(dǎo)致垃圾回收器不能對(duì) 這個(gè)類型的對(duì)象及時(shí)回收. 當(dāng)GC開始工作的時(shí)候,它首先將沒(méi)有終結(jié)器的垃圾對(duì)象從內(nèi)存中移除,有終結(jié)器的所有對(duì)象則添加到一個(gè)垃圾隊(duì)列當(dāng)中。GC會(huì)調(diào)用一個(gè)新線程來(lái)執(zhí)行這些對(duì)象的 終結(jié)器。當(dāng)終結(jié)器執(zhí)行完畢后,這個(gè)對(duì)象會(huì)從隊(duì)列中被移除。這個(gè)對(duì)象在隊(duì)列中移除之后,當(dāng)GC再次開始工作的時(shí)候,這個(gè)對(duì)象才能夠被回收,所以有終結(jié)器的對(duì) 象會(huì)比沒(méi)有的在內(nèi)存中保留更長(zhǎng)的時(shí)間。在后面我會(huì)對(duì)這里再詳細(xì)的描述一下。

  解決方案:

  在Dispose方法中調(diào)用GC.SuppressFinalize(this)方法.這樣的話,就不會(huì)把有終結(jié)器的對(duì)象則添加到垃圾隊(duì)列當(dāng)中.

  切入正題

  .net中,非托管代碼清理有兩種方式:Finalize方式和Dispose方式。

  Finalize方式:通過(guò)對(duì)自定義類型實(shí)現(xiàn)一個(gè)Finalize方法來(lái)釋放非通過(guò)資源。

  從.net2.0開始,C#編譯器不能對(duì)Finalize進(jìn)行顯示的調(diào)用和重寫,必須使用析構(gòu)函數(shù)來(lái)實(shí)現(xiàn)它。

  class A

  {

  ~A()

  {

  釋放資源;

  }

  }

  上面的代碼就是通過(guò)Finalize方式來(lái)釋放資源的跟C++用析構(gòu)函數(shù)釋放資源的代碼很象。

  但是它實(shí)現(xiàn)方式和C++不同,因?yàn)樗怯衫厥掌鱽?lái)管理內(nèi)存的。

  大家看到了,用Finalize方式釋放非托管資源很簡(jiǎn)單,但是如果你了解了他的實(shí)現(xiàn)方式,你可能就不會(huì)選擇用它來(lái)釋放非托管資源。

  那Finalize方式在.net內(nèi)部是如何實(shí)現(xiàn)的呢?

  當(dāng)GC(垃圾回收器)開始工作的時(shí)候,它首先將沒(méi)有終結(jié)器的垃圾對(duì)象從內(nèi)存中移除,有終結(jié)器的所有對(duì)象則添加到一個(gè)終止化隊(duì)列當(dāng)中。GC會(huì)調(diào)用一個(gè) 新線程來(lái)執(zhí)行這些對(duì)象的終結(jié)器。當(dāng)終結(jié)器執(zhí)行完畢后,這些對(duì)象會(huì)從隊(duì)列中被移除。這時(shí)候由于這些對(duì)象在第一次檢測(cè)到的時(shí)候沒(méi)有被釋放,它們將會(huì)進(jìn)入第1代 對(duì)象,直到GC檢測(cè)到第0代對(duì)象和第1代對(duì)象再次充滿時(shí),這時(shí)候GC才會(huì)把剛才那些對(duì)象釋放掉,所以有終結(jié)器的對(duì)象會(huì)比沒(méi)有的在內(nèi)存中保留更長(zhǎng)的時(shí)間。

上一篇:C++程序員容易犯的幾個(gè)C#錯(cuò)誤及解決辦法
下一篇:C#開發(fā)中的兩個(gè)基本原則

熱門話題

招生熱線: 4008-0731-86 / 0731-82186801

學(xué)校地址: 長(zhǎng)沙市天心區(qū)團(tuán)結(jié)路6號(hào)

Copyright © 2006 | 湖南大計(jì)信息科技有限公司 版權(quán)所有

湘ICP備14017520號(hào)-3

關(guān)注我們
在線咨詢
嘿,我來(lái)幫您!