C#清算非托管對象實例剖析。本站提示廣大學習愛好者:(C#清算非托管對象實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#清算非托管對象實例剖析正文
本文實例講述了C#清算非托管對象的辦法。分享給年夜家供年夜家參考,詳細以下:
Finalize方法在.net外部是若何完成的呢?
當GC(渣滓收受接管器)開端任務的時刻,它起首將沒有終結器的渣滓對象從內存中移除,有終結器的一切對象則添加到一個終止化隊列傍邊。GC會挪用一個 新線程來履行這些對象的終結器。當終結器履行終了後,這些對象會從隊列中被移除。這時候候因為這些對象在第一次檢測到的時刻沒有被釋放,它們將會進入第1代 對象,直到GC檢測到第0代對象和第1代對象再次充斥時,這時候候GC才會把適才那些對象釋放失落,所以有終結器的對象會比沒有的在內存中保存更長的時光。
提醒:渣滓收受接管器把托管堆中的對象分為3代,分離是0,1,2.普通分派為:0代約256K,1代約是2MB,第2代約是MB,代齡越高,容量就越 年夜,明顯效力也就越低.起首被添加到托管堆中的對象被定為第0代,當第0代充斥時,就會履行渣滓收受接管,未被收受接管的對象代領將晉升1代.
因為以上緣由應當防止僅應用Finalize方法釋放非托管資本.
Dispose形式:在自界說類中完成IDispose接口,在接口中的Dispose辦法中對非托管資本停止釋放.閒話少說,上代碼
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方法釋放資本的辦法.由於下面自界說的Dispose(bool isDisposing)辦法是virtual的,所以還可以在派生類外面對它停止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); } } }
如許可以確保釋放繼續鏈上一切對象的援用資本,在全部繼續條理中流傳Dispose形式
願望本文所述對年夜家C#法式設計有所贊助。