轉自http://www3.ccw.com.cn/club/essence/200201/7841.htm
C#中顯性地調用finalizer是不允許的,它只能被片段收集程式調用。如果希望儘快地釋放一些不再使用的數量有限的非可管理性資源(如檔案控制代碼),則應該使用IDisposable介面,這一介面有個Dispose方法,它能夠幫你完成這個任務。Dispose是無需等待Finalize被調用而能夠釋放非可管理性資源的方法。
如果已經使用了Dispose方法,則應當阻止片段收集程式再對相應的對象執行Finalize方法。為此,需要調用靜態方法GC.SuppressFinalize,並將相應對象的指標傳遞給它作為參數,Finalize方法就能調用Dispose方法了。據此,我們能夠得到如下的代碼:
public void Dispose()
{
// 完成清理操作
// 通知GC不要再調用Finalize方法
GC.SuppressFinalize(this);
}
public override void Finalize()
{
Dispose();
base.Finalize();
}
對於有些對象,可能調用Close方法就更合適(例如,對於檔案對象調用Close就比Dispose更合適),可以通過建立一個private屬性的Dispose方法和public屬性的Close方法,並讓Close調用Dispose來實現對某些對象調用Close方法。
由於不能確定一定會調用Dispose,而且finalizer的執行也是不確定的(我們無法控制GC會在何時運行),C#提供了一個Using語句來保證Dispose方法會在儘可能早的時間被調用。一般的方法是定義使用哪個對象,然後用括弧為這些對象指定一個活動的範圍,當遇到最內層的括弧時,Dispose方法就會被自動調用,對該對象進行處理。
using System.Drawing;
class Tester
{
public static void Main()
{
using (Font theFont = new Font("Arial", 10.0f))
{
//使用theFont對象
} // 編譯器將調用Dispose處理theFont對象
Font anotherFont = new Font("Courier",12.0f);
using (anotherFont)
{
// 使用anotherFont對象
} // 編譯器將調用Dispose處理anotherFont對象
}
}
在本例的第一部分中,Font對象是在Using語句中建立的。當Using語句結束時,系統就會調用Dispose,對Font對象進行處理。在本例的第二部分,Font對象是在Using語句外部建立的,在決定使用它時,再將它放在Using語句內,當Using語句結束時,系統就會調用Dispose。
Using語句還能防止其他意外的發生,保證系統一定會調用Dispose。