2009-11-07 51 views
54

我想如果你的程序沒有,但是你應該在程序中調用Dispose()來讓清理確定性,那麼GC最終會調用Dispose。垃圾收集器調用Dispose()?

不過,從我的小測試程序,我沒有看到Dispose已獲取調用所有....

public class Test : IDisposable 
{ 
    static void Main(string[] args) 
    { 
     Test s = new Test(); 
     s = null; 
     GC.Collect(); 
     Console.ReadLine(); 
    } 

    public Test() 
    { 
     Console.WriteLine("Constructor"); 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

//輸出僅僅是「構造」,我不明白「處置」如我所料。這是怎麼回事?

編輯:是的,我知道我應該調用Dispose() - 我使用一次性對象時遵循標準模式。我的問題出現是因爲我試圖追蹤某人的代碼中的泄漏,這是一個託管C++(另一個複雜的層次,可能是另一個線程的主題)。

+0

此問題是[http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for -Me(http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for-me)。 –

回答

50

GC不會呼叫Dispose,它會調用您的終結器(您應該致電Dispose(false))。

請看一側的相關帖子或查找C#的最佳實踐的Dispose模式(該docs on IDisposable解釋相當不錯IIRC)

+4

該名稱是「finializer」,它可能是不幸的,C#使用類似的語法作爲C++析構函數。 –

+1

沒錯,讓我的語言在這裏感到困惑。 – Eloff

+4

要注意的是,默認的* Finalizer *什麼都不做。另見:http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight