C#清理非托管對(duì)象實(shí)例分析
本文實(shí)例講述了C#清理非托管對(duì)象的方法。分享給大家供大家參考,具體如下:
Finalize方式在.net內(nèi)部是如何實(shí)現(xiàn)的呢?
當(dāng)GC(垃圾回收器)開(kāi)始工作的時(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ì)象再次充滿(mǎn)時(shí),這時(shí)候GC才會(huì)把剛才那些對(duì)象釋放掉,所以有終結(jié)器的對(duì)象會(huì)比沒(méi)有的在內(nèi)存中保留更長(zhǎng)的時(shí)間。
提示:垃圾回收器把托管堆中的對(duì)象分為3代,分別是0,1,2.一般分配為:0代約256K,1代約是2MB,第2代約是MB,代齡越高,容量就越 大,顯然效率也就越低.首先被添加到托管堆中的對(duì)象被定為第0代,當(dāng)?shù)?代充滿(mǎn)時(shí),就會(huì)執(zhí)行垃圾回收,未被回收的對(duì)象代領(lǐng)將提升1代.
由于以上原因應(yīng)該避免僅使用Finalize方式釋放非托管資源.
Dispose模式:在自定義類(lèi)中實(shí)現(xiàn)IDispose接口,在接口中的Dispose方法中對(duì)非托管資源進(jìn)行釋放.閑話少說(shuō),上代碼
public class MyResourceRelease: IDisposable { /// 保證資源只用釋放一次 private bool _alreadyDisposed = false; /// 用來(lái)判斷釋放資源的類(lèi)別(托管和非托管) protected virtual void Dispose(bool isDisposing) { if(_alreadyDisposed) { return; } if(isDisposing) { //釋放托管資源 } //釋放非托管資源 _alreadyDisposed = true; } public void Dispose() { Dispose(true); } }
上面的代碼就是用Dispose方式釋放資源的方法.因?yàn)樯厦孀远x的Dispose(bool isDisposing)方法是virtual的,所以還可以在派生類(lèi)里面對(duì)它進(jìn)行override
public class MyDerivedResource: MyResourceRelease { private bool _disposed = false; protected override void Dispose(bool isDisposing) { if(_disposed) { return; } try { if(isDisposing) { //釋放托管資源 } //釋放非托管資源 _disposed = true; } finally { base.Dispose(isDisposing); } } }
這樣可以確保釋放繼承鏈上所有對(duì)象的引用資源,在整個(gè)繼承層次中傳播Dispose模式
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見(jiàn)控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
基于WPF實(shí)現(xiàn)經(jīng)典紙牌游戲
這篇文章主要為大家詳細(xì)介紹了如何溧陽(yáng)WPF實(shí)現(xiàn)經(jīng)典紙牌游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)WPF有一定的幫助,需要的可以參考一下2023-02-02unity shader實(shí)現(xiàn)玻璃折射效果
這篇文章主要為大家詳細(xì)介紹了unity shader實(shí)現(xiàn)玻璃折射效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C# 基于udp廣播收集局域網(wǎng)類(lèi)所有設(shè)備信息
這篇文章主要介紹了C# 基于udp廣播收集局域網(wǎng)類(lèi)所有設(shè)備信息的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12.net(c#)中的new關(guān)鍵字詳細(xì)介紹
在 C# 中,new 關(guān)鍵字可用作運(yùn)算符、修飾符或約束2013-10-10C#中調(diào)用MySQL存儲(chǔ)過(guò)程的方法
這篇文章主要介紹了C#中調(diào)用MySQL存儲(chǔ)過(guò)程的方法,涉及C#數(shù)據(jù)庫(kù)操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07利用C#編寫(xiě)Linux守護(hù)進(jìn)程實(shí)例代碼
如今的編程是一場(chǎng)程序員和上帝的競(jìng)賽,程序員要開(kāi)發(fā)出更大更好、傻瓜都會(huì)用到軟件,下面這篇文章主要給大家介紹了關(guān)于利用C#編寫(xiě)Linux守護(hù)進(jìn)程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2018-01-01使用C#來(lái)編寫(xiě)一個(gè)異步的Socket服務(wù)器
這篇文章主要介紹了使用C#來(lái)編寫(xiě)一個(gè)異步的Socket服務(wù)器,通過(guò)無(wú)阻塞機(jī)制來(lái)獲取更高的處理效率,需要的朋友可以參考下2015-07-07WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(四)之緩動(dòng)函數(shù)
這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之緩動(dòng)函數(shù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C#實(shí)現(xiàn)讀取Word表格到DataSet
在應(yīng)用項(xiàng)目里,多數(shù)情況下我們會(huì)遇到導(dǎo)入 Excel 文件數(shù)據(jù)到數(shù)據(jù)庫(kù)的功能需求,但某些情況下,也存在使用 Word 進(jìn)行表格數(shù)據(jù)編輯的情況,這其中也包括導(dǎo)入Word內(nèi)容的功能,比如表格數(shù)據(jù)導(dǎo)出到DataSet數(shù)據(jù)集,本文將給大家介紹了C#讀取Word表格到DataSet2023-12-12