2013-09-30 35 views
1

最後確定() -
此功能將清理在垃圾收集過程中的非託管資源只有 - 當實際執行該方法
用戶不知道。
此外,用戶不能直接調用此函數來清理內存。垃圾回收概念

Dispose() -
通過實現IDisposable接口,用戶可以清理UnManaged資源,用戶可以清楚地知道何時資源被釋放。

我的理解是Finalize()不能被覆蓋來清理非託管資源。
這是一個僅用於'GC'進程將用於清理非託管資源的系統進程。
如果用戶需要自行清理資源,那麼他/她應該實現IDisposable接口並顯式調用Dispose()。沒有其他的可能!
清理非託管資源的最佳做法是使用'USING'語句。

問題1: 我的理解是否正確?如果我錯了,請在上面的陳述中糾正我。

問題2: 另外,我想知道,我可以清理管理資源通過實現IDisposable接口,並通過調用Dispose()?

+3

http://stackoverflow.com/questions/732864/finalize-vs-dispose –

+0

最後這兩種方法釋放非託管資源。有什麼區別的Finalize()和Dispose() – Simbu

+0

Dispose( )是釋放非託管資源的唯一方法,並且在殺死對象時應該顯式調用它。 Finalize()是由CLR調用的,當它調用Dispose()時,依靠Finalize()(因此不會自己調用Dispose())意味着您完全無法控制何時釋放非託管資源。這可能意味着您不必要地打開數據庫連接等。因此:當您擁有非託管資源時,同時實現IDisposable和Finalize(),並確保您的調用者調用Dispose()。 –

回答

1

Finalize不會清理內存。它處理非託管資源。在.NET應用程序中,內存是託管資源,分配和釋放內存由運行時處理。你不必做任何特別的事情。垃圾回收器會在對象符合收集條件時回收內存。

這導致您的第二個問題的答案:不,您不能使用IDisposable來清理內存,因爲內存是通過垃圾回收自動回收的。使用IDisposable來處理GC未處理的資源(例如句柄)。