欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C# 托管資源與非托管資源

托管資源:

Net平臺中,CLR為程序員提供了一種很好的內存管理機制,使得程序員在編寫(xiě)代碼時(shí)不要顯式的去釋放自己使用的內存資源(這些在先前C和C++中是需要程序員自己去顯式的釋放的)。這種管理機制稱(chēng)為GC(garbage collection)。GC的作用是很明顯的,當系統內存資源匱乏時(shí),它就會(huì )被激發(fā),然后自動(dòng)的去釋放那些沒(méi)有被使用的托管資源(也就是程序員沒(méi)有顯式釋放的對象)。

所以托管就是.net framework 負責幫你管理內存及資源釋放,不需要自己控制,當然對象只針對托管資源(部分引用類(lèi)型), 不回收非托管資源。 像數組,用戶(hù)定義的類(lèi)、接口、委托,object,字符串等引用類(lèi)型,棧上保存著(zhù)一個(gè)地址而已,當棧釋放后, 即使對象已經(jīng)沒(méi)有用了,但堆上分配的內存還在,只能等GC收集時(shí)才能真正釋放 ;但注意int,float,DateTime之類(lèi)的值類(lèi)型,GC會(huì )自動(dòng)釋放他們占用的內存,不需要GC來(lái)回收釋放

那么非托管的資源怎么釋放回收呢?


非托管資源: 

對于非托管資源,GC只能跟蹤非托管資源的生存期,而不知道如何去釋放它。這樣就會(huì )出現當資源用盡時(shí)就不能提供資源能夠提供的服務(wù),windows的運行速度就會(huì )變慢。比如當你鏈接了數據庫,用完后你沒(méi)有顯式的釋放數據庫資源,如果還是不斷的申請數據庫資源,那么到一定時(shí)候程序就會(huì )拋出一個(gè)異常。


所以,當我們在類(lèi)中封裝了對非托管資源的操作時(shí),我們就需要顯式,或者是隱式的釋放這些資源。在.Net中釋放非托管資源主要有2種方式,Dispose,Finalize,而Finalize和Dispose方法分別就是隱式和顯式操作中分別使用到的方法。

例如文件流,數據庫的連接,系統的窗口句柄,打印機資源等等,當你讀取文件之后,就需要對各種Stream進(jìn)行Dispose等操作。比如 SqlDataReader 讀取數據完畢之后,需要 reader.Dispose();等

Finalize一般情況下用于基類(lèi)不帶close方法或者不帶Dispose顯式方法的類(lèi),也就是說(shuō),在Finalize過(guò)程中我們需要隱式的去實(shí)現非托管資源的釋放,然后系統會(huì )在Finalize過(guò)程完成后,自己的去釋放托管資源。在.NET中應該盡可能的少用析構函數釋放資源,MSDN2上有這樣一段話(huà):實(shí)現 Finalize 方法或析構函數對性能可能會(huì )有負面影響,因此應避免不必要地使用它們。用 Finalize 方法回收對象使用的內存需要至少兩次垃圾回收。所以有析構函數的對象,需要兩次,第一次調用析構函數,第二次刪除對象。而且在析構函數中包含大量的釋放資源代碼,會(huì )降低垃圾回收器的工作效率,影響性能。所以對于包含非托管資源的對象,最好及時(shí)的調用Dispose()方法來(lái)回收資源,而不是依賴(lài)垃圾回收器。

  托管資源指的是.NET可以自動(dòng)進(jìn)行回收的資源,主要是指托管堆上分配的內存資源。托管資源的回收工作是不需要人工干預的,有.NET運行庫在合適調用垃圾回收器進(jìn)行回收。

         非托管資源指的是.NET不知道如何回收的資源,最常見(jiàn)的一類(lèi)非托管資源是包裝操作系統資源的對象,例如文件,窗口,網(wǎng)絡(luò )連接,數據庫連接,畫(huà)刷,圖標等。這類(lèi)資源,垃圾回收器在清理的時(shí)候會(huì )調用Object.Finalize()方法。默認情況下,方法是空的,對于非托管對象,需要在此方法中編寫(xiě)回收非托管資源的代碼,以便垃圾回收器正確回收資源。

         在.NET中,Object.Finalize()方法是無(wú)法重載的,編譯器是根據類(lèi)的析構函數來(lái)自動(dòng)生成Object.Finalize()方法的,所以對于包含非托管資源的類(lèi),可以將釋放非托管資源的代碼放在析構函數。

         注意,不能在析構函數中釋放托管資源,因為析構函數是有垃圾回收器調用的,可能在析構函數調用之前,類(lèi)包含的托管資源已經(jīng)被回收了,從而導致無(wú)法預知的結果。

         本來(lái)如果按照上面做法,非托管資源也能夠由垃圾回收器進(jìn)行回收,但是非托管資源一般是有限的,比較寶貴的,而垃圾回收器是由CRL自動(dòng)調用的,這樣就無(wú)法保證及時(shí)的釋放掉非托管資源,因此定義了一個(gè)Dispose()方法,讓使用者能夠手動(dòng)的釋放非托管資源。Dispose()方法釋放類(lèi)的托管資源和非托管資源,使用者手動(dòng)調用此方法后,垃圾回收器不會(huì )對此類(lèi)實(shí)例再次進(jìn)行回收。Dispose()方法是由使用者調用的,在調用時(shí),類(lèi)的托管資源和非托管資源肯定都未被回收,所以可以同時(shí)回收兩種資源。

         Microsoft為非托管資源的回收專(zhuān)門(mén)定義了一個(gè)接口:IDisposable,接口中只包含一個(gè)Dispose()方法。任何包含非托管資源的類(lèi),都應該繼承此接口。

         在一個(gè)包含非托管資源的類(lèi)中,關(guān)于資源釋放的標準做法是:

         (1)     繼承IDisposable接口;

         (2)     實(shí)現Dispose()方法,在其中釋放托管資源和非托管資源,并將對象本身從垃圾回收器中移除(垃圾回收器不在回收此資源);

         (3)     實(shí)現類(lèi)析構函數,在其中釋放非托管資源。

         在使用時(shí),顯示調用Dispose()方法,可以及時(shí)的釋放資源,同時(shí)通過(guò)移除Finalize()方法的執行,提高了性能;如果沒(méi)有顯示調用Dispose()方法,垃圾回收器也可以通過(guò)析構函數來(lái)釋放非托管資源,垃圾回收器本身就具有回收托管資源的功能,從而保證資源的正常釋放,只不過(guò)由垃圾回收器回收會(huì )導致非托管資源的未及時(shí)釋放的浪費。

         在.NET中應該盡可能的少用析構函數釋放資源。在沒(méi)有析構函數的對象在垃圾處理器一次處理中從內存刪除,但有析構函數的對象,需要兩次,第一次調用析構函數,第二次刪除對象。而且在析構函數中包含大量的釋放資源代碼,會(huì )降低垃圾回收器的工作效率,影響性能。所以對于包含非托管資源的對象,最好及時(shí)的調用Dispose()方法來(lái)回收資源,而不是依賴(lài)垃圾回收器。

         上面就是.NET中對包含非托管資源的類(lèi)的資源釋放機制,只要按照上面要求的步驟編寫(xiě)代碼,類(lèi)就屬于資源安全的類(lèi)。

         下面用一個(gè)例子來(lái)總結一下.NET非托管資源回收機制:

Public class BaseResource:IDisposable { PrivateIntPtr handle; // 句柄,屬于非托管資源 PrivateComponet comp; // 組件,托管資源 Privateboo isDisposed = false; // 是否已釋放資源的標志 PublicBaseResource { } //實(shí)現接口方法 //由類(lèi)的使用者,在外部顯示調用,釋放類(lèi)資源 Publicvoid Dispose() { Dispose(true);// 釋放托管和非托管資源 //將對象從垃圾回收器鏈表中移除, // 從而在垃圾回收器工作時(shí),只釋放托管資源,而不執行此對象的析構函數 GC.SuppressFinalize(this); } //由垃圾回收器調用,釋放非托管資源 ~BaseResource() { Dispose(false);// 釋放非托管資源 } //參數為true表示釋放所有資源,只能由使用者調用 //參數為false表示釋放非托管資源,只能由垃圾回收器自動(dòng)調用 //如果子類(lèi)有自己的非托管資源,可以重載這個(gè)函數,添加自己的非托管資源的釋放 //但是要記住,重載此函數必須保證調用基類(lèi)的版本,以保證基類(lèi)的資源正常釋放 Protectedvirtual void Dispose(bool disposing) { If(!this.disposed)// 如果資源未釋放 這個(gè)判斷主要用了防止對象被多次釋放 { If(disposing) { Comp.Dispose();// 釋放托管資源 } closeHandle(handle);// 釋放非托管資源 handle= IntPtr.Zero; } this.disposed= true; // 標識此對象已釋放 } }

         

         析構函數只能由垃圾回收器調用。

         Despose()方法只能由類(lèi)的使用者調用。

         在C#中,凡是繼承了IDisposable接口的類(lèi),都可以使用using語(yǔ)句,從而在超出作用域后,讓系統自動(dòng)調用Dispose()方法。
         一個(gè)資源安全的類(lèi),都實(shí)現了IDisposable接口和析構函數。提供手動(dòng)釋放資源和系統自動(dòng)釋放資源的雙保險。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
淺談C#內存回收與Dispose﹐Close﹐Finalize方法[轉]
C#中的析構函數
從C#垃圾回收(GC)機制中挖掘性能優(yōu)化方案
談?wù)凜#中的 Dispose 和 Finalize
對.Net 垃圾回收的C#編程相關(guān)方面(Finalize 和Dispose(bool di...
深入.NET托管堆(managed heap)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久