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#法式設計有所贊助。