程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#清算非托管對象實例剖析

C#清算非托管對象實例剖析

編輯:C#入門知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved