標籤:連結 div interface 總結 原因 ide 設計 task 虛方法
在Net中,由GC記憶體回收線程掌握對象資源的釋放,程式員無法掌控解構函式的調用時機。對於一些非託管資源,比如資料庫連結化物件等,需要實現IDisposable介面進行手動的記憶體回收。那麼什麼時候使用Idisposable介面,以及如何使用呢?
一、IDisposable的介面定義如下
public interface IDisposable
{
// Summary:
// Performs application-defined tasks associated with freeing, releasing, or
// resetting unmanaged resources.
void Dispose();
}
二:IDisposable基本應用
1.定義一個實現了IDisposable介面的類
C# 代碼 複製
public class CaryClass :IDisposable { public void DoSomething() { Console.WriteLine("Do some thing...."); } public void Dispose() { Console.WriteLine("及時釋放資源"); } }
2、兩種方式來調用
(1)、使用Using語句會自動調用Dispose方法
using (CaryClass caryClass = new CaryClass())
{
caryClass.DoSomething();
}
(2)、現實調用該介面的Dispose方法
CaryClass caryClass = new CaryClass();try{ caryClass.DoSomething(); }finally{ IDisposable disposable = caryClass as IDisposable; if (disposable != null) disposable.Dispose();}
三、IDisposable實現釋放資源
C# 代碼 複製
public class DisposablClass : IDisposable{ //是否回收完畢 bool _disposed; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } DisposableClass() { Dispose(false); } //這裡的參數表示示是否需要釋放那些實現IDisposable介面的託管對象 protected virtual void Dispose(bool disposing) { if(_disposed) return; //如果已經被回收,就中斷執行 if(disposing) { //TODO:釋放那些實現IDisposable介面的託管對象 } //TODO:釋放非託管資源,設定對象為null _disposed = true; }}
四、IDisposable執行個體分析
Dispose()方法
當需要回收非託管資源的DisposableClass類,就調用Dispoase()方法。而這個方法不會被CLR自動調用,需要手動調用。
DisposableClass(),解構函式
當託管堆上的對象沒有被其它對象引用,GC會在回收對象之前,調用對象的解構函式。這裡的~DisposableClass()解構函式的意義在於告訴GC你可以回收我,Dispose(false)表示在GC回收的時候,就不需要手動回收了。
虛方法Dispose(bool disposing)
1、通過此方法,所有的託管和非託管資源都能被回收。參數disposing表示是否需要釋放那些實現IDisposable介面的託管對象。
2、如果disposings設定為true,就表示DisposablClass類依賴某些實現了IDisposable介面的託管對象,可以通過這裡的Dispose(bool disposing)方法調用這些託管對象的Dispose()方法進行回收。
3、如果disposings設定為false,就表示DisposableClass類依賴某些沒有實現IDisposable的非託管資源,那就把這些非託管資來源物件設定為null,等待GC調用DisposableClass類的解構函式,把這些非託管資源進行回收。
4、另外,以上把Dispose(bool disposing)方法設定為protected virtual的原因是希望有子類可以一起參與到記憶體回收邏輯的設計,而且還不會影響到基類。
比如有這樣的一個子類
C# 代碼 複製
public class SubDisposableClass : DiposableClass{ private bool _disposed; //表示是否已經被回收 protected override void Dispose(bool disposing) { if(!_disposed) //如果還沒有被回收 { if(disposiing) //如果需要回收一些託管資源 { //TODO:回收託管資源,調用IDisposable的Dispose()方法就可以 } //TODO:回收非託管資源,把之設定為null,等待CLR調用解構函式的時候回收 _disposed = true; } base.Dispose(disposing);//再調用父類的記憶體回收邏輯 }}
五、IDisposable總結
當我們自訂的類及其商務邏輯中引用某些託管和非託管資源,就需要實現IDisposable介面,實現對這些資來源物件的記憶體回收。
轉載自 http://www.studyofnet.com/news/590.html
C#中IDisposable的用法