C#清理非托管對象實(shí)例分析
本文實(shí)例講述了C#清理非托管對象的方法。分享給大家供大家參考,具體如下:
Finalize方式在.net內(nèi)部是如何實(shí)現(xiàn)的呢?
當(dāng)GC(垃圾回收器)開始工作的時(shí)候,它首先將沒有終結(jié)器的垃圾對象從內(nèi)存中移除,有終結(jié)器的所有對象則添加到一個(gè)終止化隊(duì)列當(dāng)中。GC會調(diào)用一個(gè) 新線程來執(zhí)行這些對象的終結(jié)器。當(dāng)終結(jié)器執(zhí)行完畢后,這些對象會從隊(duì)列中被移除。這時(shí)候由于這些對象在第一次檢測到的時(shí)候沒有被釋放,它們將會進(jìn)入第1代 對象,直到GC檢測到第0代對象和第1代對象再次充滿時(shí),這時(shí)候GC才會把剛才那些對象釋放掉,所以有終結(jié)器的對象會比沒有的在內(nèi)存中保留更長的時(shí)間。
提示:垃圾回收器把托管堆中的對象分為3代,分別是0,1,2.一般分配為:0代約256K,1代約是2MB,第2代約是MB,代齡越高,容量就越 大,顯然效率也就越低.首先被添加到托管堆中的對象被定為第0代,當(dāng)?shù)?代充滿時(shí),就會執(zhí)行垃圾回收,未被回收的對象代領(lǐng)將提升1代.
由于以上原因應(yīng)該避免僅使用Finalize方式釋放非托管資源.
Dispose模式:在自定義類中實(shí)現(xiàn)IDispose接口,在接口中的Dispose方法中對非托管資源進(jìn)行釋放.閑話少說,上代碼
public class MyResourceRelease: IDisposable
{
/// 保證資源只用釋放一次
private bool _alreadyDisposed = false;
/// 用來判斷釋放資源的類別(托管和非托管)
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的,所以還可以在派生類里面對它進(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);
}
}
}
這樣可以確保釋放繼承鏈上所有對象的引用資源,在整個(gè)繼承層次中傳播Dispose模式
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
ListView Adapter優(yōu)化 實(shí)例
ListView Adapter優(yōu)化 實(shí)例,需要的朋友可以參考一下2013-04-04
C#中Winform獲取文件路徑的方法實(shí)例小結(jié)
這篇文章主要介紹了C#中Winform獲取文件路徑的方法,以實(shí)例形式較為詳細(xì)的總結(jié)了WinForm關(guān)于路徑操作的常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案
這篇文章主要介紹了Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

