我有幾個問題,我無法得到正確的答案。我們爲什麼要在沒有析構函數時調用SuppressFinalize
1)爲什麼當我們沒有析構函數時,我們應該在Dispose函數中調用SuppressFinalize。
2)Dispose和finalize用於在垃圾收集對象之前釋放資源。無論是託管資源還是非託管資源,我們需要釋放資源,那麼爲什麼我們需要在dispose函數內部存在一個條件,當我們從IDisposable調用這個重寫函數時傳遞'true':Dispose並在從finalize調用時傳遞false。
看到下面的代碼,我從網上覆制。
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
如果我刪除了布爾保護的Dispose函數並執行如下操作,該怎麼辦?
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose();
}
public void Dispose()
{
// Code to dispose the managed resources of the class
// Code to dispose the un-managed resources of the class
isDisposed = true;
// Call this since we have a destructor . what if , if we don't have one
GC.SuppressFinalize(this);
}
}
嗨,喬恩,只是挑剔,但句子「任何持有資源直接可以處理的」,應該可能是「將處理該」,(即「可以」 - >「將」),以強調根本不是外部班級的工作。 – 2010-04-09 10:21:13
還有一個問題,因爲System.Object是所有對象的基礎,默認情況下它已經實現了一個finalize方法,即使我們沒有提供析構函數,也不會將GC放到finalize隊列中嗎?或者爲什麼我們說如果我們不提供destrutor對象不會被放入最終隊列?因爲通過繼承保護成員就像派生類的私有成員。 – somaraj 2010-04-09 10:58:46
從非平凡的父類派生的子類是否有任何合法的原因,如果父類不具有清理終結器?我想不出任何情況下,派生類將任何非託管資源封裝到自己的類中,並將其自己的終結器完全脫離主類。實際上,即使所有人都想要一個「警鐘」終結器,最好將* *封裝到它自己的類中,而不是爲派生類添加終結器。 – supercat 2012-04-12 15:01:37