国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 01:15:25
字體:
來源:轉載
供稿:網友

本文實例講述了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#相關內容感興趣的讀者可查看本站專題:《C#數據結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安丘市| 霸州市| 安顺市| 拉孜县| 朔州市| 仲巴县| 盐城市| 铜梁县| 宝兴县| 四平市| 海阳市| 晋中市| 永和县| 财经| 正定县| 北安市| 高尔夫| 盈江县| 崇阳县| 繁峙县| 石屏县| 闸北区| 华蓥市| 策勒县| 江阴市| 巴中市| 西林县| 临洮县| 靖宇县| 临西县| 米脂县| 巴彦淖尔市| 闽清县| 荣成市| 辽阳市| 宁明县| 凯里市| 宜兰县| 互助| 尼勒克县| 射阳县|