Finalize和Dispose使用誰?

來源:互聯網
上載者:User
轉自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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.