Finalize和Dispose都是用來釋放資源的。
Finalize也就是析構(gòu)函數(shù),是由gc來決定的屁药,等到gc執(zhí)行的時候才會去調(diào)用本刽,而Dispose一般是我們主動去調(diào)用的,在c#里面殿较,當(dāng)我們使用using括起來的代碼塊,會在結(jié)束之后主動調(diào)用Dispose。比如:
using(MyClass my=new MyClass())
{
}
這段代碼在執(zhí)行完畢之后就會主動調(diào)用MyClass 的Dispose方法笋额。
解釋一下為什么我們經(jīng)常會有一個protect類型的Dispose方法,參數(shù)是boo類型篷扩,形如
protect Dispose(bool disposing)
引用一段話:
只有一個Dispose()不可以. 為什么呢?因為如果只有一個Dispose()而沒有Dispose(bool disposing)方法.那么在處理實現(xiàn)非托管資源釋放的代碼中無法判斷該方法是客戶調(diào)用的還是垃圾回收器通過Finalize調(diào)用的.無法實現(xiàn) 判斷如果是客戶手動調(diào)用,那么就不希望垃圾回收器再調(diào)用Finalize()(調(diào)用GC.SupperFinalize方法).另一個可能的原因(:我們知道如果是垃圾回收器通過Finalize調(diào)用的,那么在釋放代碼中我們可能還會引用其他一些托管對象,而此時這些托管對象可能已經(jīng)被垃圾回收了, 這樣會導(dǎo)致無法預(yù)知的執(zhí)行結(jié)果(千萬不要在Finalize中引用其他的托管對象).
還有一個好處兄猩,對外只提供Dispose方法,這樣就不會錯誤的調(diào)用Dispose(false)了鉴未。
public class MyClass:IDisposable
{
~MyClass()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
// 那么這個方法是被客戶直接調(diào)用的,那么托管的,和非托管的資源都可以釋放
if(disposing)
{
// 釋放 托管資源
}
//釋放非托管資源
// 那么這個方法是被客戶直接調(diào)用的,告訴垃圾回收器從Finalization隊列中清除自己,從而阻止垃圾回 收器調(diào)用Finalize方法.
if(disposing)
GC.SuppressFinalize(this);
}
//主動調(diào)用的dispose
public void Dispose()
{
Dispose(true);
}
}