如果我的類沒有析構函數,它會超出範圍。 GC在某些時候運行,現在它只是從我的類中回收內存,或者它會調用它的析構函數還是Finalize()?如果我的類沒有析構函數,那麼GC會調用Finalize()嗎?
像。SQLConnection這樣的.NET框架類是否實現了一個析構函數?我看到它有一個Dispose()實現,但沒有看到使用「Go to definition」的析構函數。
如果我的類沒有析構函數,它會超出範圍。 GC在某些時候運行,現在它只是從我的類中回收內存,或者它會調用它的析構函數還是Finalize()?如果我的類沒有析構函數,那麼GC會調用Finalize()嗎?
像。SQLConnection這樣的.NET框架類是否實現了一個析構函數?我看到它有一個Dispose()實現,但沒有看到使用「Go to definition」的析構函數。
的Finalize被稱爲僅當物體被放置在結束隊列中的對象上。把它放在那裏的一個方法是給它一個析構函數。在C#中,如果沒有析構函數,該對象將不會被放置在最終隊列中。
正如其他人指出,除非必須,否則不要使用析構函數,因爲它會減緩垃圾回收速度。當GC發現可以回收這樣一個對象時,不是釋放內存,而是將對象放在最終化隊列中。換句話說,該物體在初始GC中存活並且僅在執行終結器後纔會被回收。
據我所知,Finalize()
的默認實現不做任何事情,所以如果它調用或不調用都不重要。
絕大多數課程不需要自定義終結器,如果您正在使用受管資源,Garbage Collector
將能夠清除它。
如果您的課程不使用非託管資源,那麼您應該避免使用Finalize
實施,因爲它們需要時間。
閱讀本文可能有幫助,但從我知道如果有析構函數/ Finalize它將被稱爲其他GC將siply釋放內存。
如果對象沒有析構那麼它不被添加到在所述第一位置終結隊列,所以GC將簡單地釋放存儲器等時,它清除。
GC只調用終結隊列中對象的析構函數/終止代碼。
@Luke - 謝謝,這是有道理的。 – 2010-04-15 13:44:48
這是少的可憐。對所有「一無所知」回答這個問題的人們都感到羞恥,也沒有真正回答這個問題。
這裏是你的答案:
這種方法,除非對象已經最後確定到SuppressFinalize調用被豁免自動對象變得不可訪問後調用。在應用程序域關閉期間,Finalize會自動調用到不能完成的對象,即使那些仍然可以訪問的對象。 Finalize在給定實例上只會自動調用一次,除非對象使用ReRegisterForFinalize和GC.SuppressFinalize之類的機制重新註冊。
來自:
http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx
您can't call a destructor
in C#,本身。它們被自動調用。
您可以實例化一個新的對象,只要所有的資源進行管理(讀:沒有實現IDisposible
),它會被垃圾收集時:
對於實現IDisposible
類,最好的辦法是來包裝他們的使用在using
聲明,這將確保Dispose()
方法在對象超出範圍時調用。
推薦閱讀:
感謝我所知道的這些,看了直通很多文章,原以爲會有人知道確切的答案,這個,在這裏發佈。 – 2010-04-15 12:13:10