的IDisposable
模式是一個對象,可以消耗及時免費非託管和託管資源的機制:如果你將它們包裝成using
聲明更容易。
模式實現的典型方法如下:
public void Dispose() //Implementes the IDisposable interface
{
this.Dispose(true);
GC.SupressFinalize(this); //All resources have been released, no need to run the finalizer. We make the GC's life a little easier;
}
protected void Dispose(bool disposing)
{
if (disposing)
{
//Relesase managed resources.
}
//Release unmanaged resources.
}
~MyDisposableObject() //finalizer
{
this.Dispose(false)
}
這裏要注意的一點是,資源通過Dispose
方法釋放是非常相似的,你在邏輯上希望在一個找一下終結者。它不是在終結直接完成主要有兩個原因:
的終結不確定性的順序執行。這就是爲什麼我們不處理來自終結器(Dispose(false)
)的管理資源,因爲對象所持有的一些或所有受管資源可能已在對象本身之前完成。這對非託管資源來說並非如此,因爲根據定義,它們將永遠不會被GC
最終確定。
我們不知道當終結器運行(它是由GC
)。
的基本思路是,實施IDisposable
對象爲任何消費者說一個牌子:「哎,我持有一定量的非託管和/或管理的資源最終將被釋放時GC
決定我不再有用,但如果您及時需要這些資源,請撥打Dispose(),我會很樂意提供。「。
另一方面,將參考變量設置爲null
根本不釋放任何資源。 如果從對象中刪除的引用是唯一指向該對象的引用,那麼對象最終將被GC
收集,並且託管和非託管資源將被釋放(何時,是否有人猜測)。
如果還有更多的實時引用仍然指向該對象,那麼該對象將生活一個,並且任何資源都不會被釋放。
檢查我的答案,我錯誤地發佈它作爲評論:) –