在.NET中,當一個對象不能從任何地方被引用時,垃圾收集器將自動釋放內存。當它這樣做時,如果對象有終結器,它會調用終結器。終結者是爲了清理,通常是非託管資源。但是,終結器是昂貴的(例如,它們會延遲對象上的垃圾回收),並且無法確定它何時運行(因爲無法判斷GC什麼時候會決定收集它)。他們通常被留作清理非託管資源之類的最後手段。
這是IDisposable接口和它的Dispose方法進來的地方。Dispose也可以用來清理託管和非託管資源。當您調用Dispose方法時,它將清除並且對象不再處於穩定的可用狀態。
如果您有一個實現IDisposable的資源,您可以在知道完成後調用Dispose。它所持有的這種方式和資源可以儘快釋放出來。這樣做的通常方法是將其封裝在using語句中,當using塊完成時它將自動Dispose。例如:
using (SomeDisposableObject disposableObject = new SomeDisposableObject())
{
disposableObject.DoSomeStuff();
disposableObject.DoSomeMoreStuff();
}
當使用塊完成時(在DoMoreStuff之後)DisposeObject上調用Dispose。在考慮異常處理時,使用語句比等效代碼清晰得多。
對於像ToolTip這樣的非託管引用(非託管Win32組件中包含很多WinForms)的情況,它將會有一個終結器來確保正確釋放未被佔用的資源。但是,如果您在對象上調用Dispose,則會在該處運行清理代碼,然後禁用終結器(當GC收集對象時它不會運行)。
因此,要直接回答您的問題,如果您確切知道IDisposable何時完成,則最好調用Dispose。但是,如果您不這樣做,通常只需將其留給垃圾收集器來收集並調用相關代碼即可正確清理該對象。
在給出ToolTip和Timer的情況下,我不會擔心自己調用Dispose,因爲我懷疑它很難預測什麼時候會完成。
來源
2009-12-23 21:45:23
ICR
這樣做很有意義,不必要的預訂會使代碼複雜化並在調用GC之前實現少量字節的減少。但是如何確保對象不需要手動處理,其他職位的人說你需要調用Dispose表單相關的對象,因爲他們有HWND等。 –
如果可以,請調用Dispose來清理HWND等等。但是,如果你不知道終結者應該爲你清理它。不知道如何與意想不到的應用程序退出等事情相符。希望有更多合格的人可以詳細說明。 – ICR