欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#清理非托管對象實例分析

 更新時間:2016年02月29日 09:34:52   作者:Microblue  
這篇文章主要介紹了C#清理非托管對象的方法,結合實例形式詳細分析了C#清理非托管對象釋放資源的相關原理與實現技巧,需要的朋友可以參考下

本文實例講述了C#清理非托管對象的方法。分享給大家供大家參考,具體如下:

Finalize方式在.net內部是如何實現的呢?

當GC(垃圾回收器)開始工作的時候,它首先將沒有終結器的垃圾對象從內存中移除,有終結器的所有對象則添加到一個終止化隊列當中。GC會調用一個 新線程來執(zhí)行這些對象的終結器。當終結器執(zhí)行完畢后,這些對象會從隊列中被移除。這時候由于這些對象在第一次檢測到的時候沒有被釋放,它們將會進入第1代 對象,直到GC檢測到第0代對象和第1代對象再次充滿時,這時候GC才會把剛才那些對象釋放掉,所以有終結器的對象會比沒有的在內存中保留更長的時間。

提示:垃圾回收器把托管堆中的對象分為3代,分別是0,1,2.一般分配為:0代約256K,1代約是2MB,第2代約是MB,代齡越高,容量就越 大,顯然效率也就越低.首先被添加到托管堆中的對象被定為第0代,當第0代充滿時,就會執(zhí)行垃圾回收,未被回收的對象代領將提升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#相關內容感興趣的讀者可查看本站專題:《C#數據結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結

希望本文所述對大家C#程序設計有所幫助。

相關文章

  • 基于WPF實現經典紙牌游戲

    基于WPF實現經典紙牌游戲

    這篇文章主要為大家詳細介紹了如何溧陽WPF實現經典紙牌游戲,文中的示例代碼講解詳細,對我們學習WPF有一定的幫助,需要的可以參考一下
    2023-02-02
  • unity shader實現玻璃折射效果

    unity shader實現玻璃折射效果

    這篇文章主要為大家詳細介紹了unity shader實現玻璃折射效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C# 基于udp廣播收集局域網類所有設備信息

    C# 基于udp廣播收集局域網類所有設備信息

    這篇文章主要介紹了C# 基于udp廣播收集局域網類所有設備信息的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • 高效C#編碼優(yōu)化原則

    高效C#編碼優(yōu)化原則

    這篇文章主要介紹了高效C#編碼優(yōu)化原則,非常實用,需要的朋友可以參考下
    2014-08-08
  • .net(c#)中的new關鍵字詳細介紹

    .net(c#)中的new關鍵字詳細介紹

    在 C# 中,new 關鍵字可用作運算符、修飾符或約束
    2013-10-10
  • C#中調用MySQL存儲過程的方法

    C#中調用MySQL存儲過程的方法

    這篇文章主要介紹了C#中調用MySQL存儲過程的方法,涉及C#數據庫操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 利用C#編寫Linux守護進程實例代碼

    利用C#編寫Linux守護進程實例代碼

    如今的編程是一場程序員和上帝的競賽,程序員要開發(fā)出更大更好、傻瓜都會用到軟件,下面這篇文章主要給大家介紹了關于利用C#編寫Linux守護進程的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-01-01
  • 使用C#來編寫一個異步的Socket服務器

    使用C#來編寫一個異步的Socket服務器

    這篇文章主要介紹了使用C#來編寫一個異步的Socket服務器,通過無阻塞機制來獲取更高的處理效率,需要的朋友可以參考下
    2015-07-07
  • WPF實現動畫效果(四)之緩動函數

    WPF實現動畫效果(四)之緩動函數

    這篇文章介紹了WPF實現動畫效果之緩動函數,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C#實現讀取Word表格到DataSet

    C#實現讀取Word表格到DataSet

    在應用項目里,多數情況下我們會遇到導入 Excel 文件數據到數據庫的功能需求,但某些情況下,也存在使用 Word 進行表格數據編輯的情況,這其中也包括導入Word內容的功能,比如表格數據導出到DataSet數據集,本文將給大家介紹了C#讀取Word表格到DataSet
    2023-12-12

最新評論