程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 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方法中對非托管資源進行釋放.閒話少說,上代碼

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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模式

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