2010-04-15 38 views
0

如果我的類沒有析構函數,它會超出範圍。 GC在某些時候運行,現在它只是從我的類中回收內存,或者它會調用它的析構函數還是Finalize()?如果我的類沒有析構函數,那麼GC會調用Finalize()嗎?

像。SQLConnection這樣的.NET框架類是否實現了一個析構函數?我看到它有一個Dispose()實現,但沒有看到使用「Go to definition」的析構函數。

回答

2

的Finalize被稱爲僅當物體被放置在結束隊列中的對象上。把它放在那裏的一個方法是給它一個析構函數。在C#中,如果沒有析構函數,該對象將不會被放置在最終隊列中。

正如其他人指出,除非必須,否則不要使用析構函數,因爲它會減緩垃圾回收速度。當GC發現可以回收這樣一個對象時,不是釋放內存,而是將對象放在最終化隊列中。換句話說,該物體在初始GC中存活並且僅在執行終結器後纔會被回收。

0

據我所知,Finalize()的默認實現不做任何事情,所以如果它調用或不調用都不重要。

絕大多數課程不需要自定義終結器,如果您正在使用受管資源,Garbage Collector將能夠清除它。

如果您的課程不使用非託管資源,那麼您應該避免使用Finalize實施,因爲它們需要時間。

+0

感謝我所知道的這些,看了直通很多文章,原以爲會有人知道確切的答案,這個,在這裏發佈。 – 2010-04-15 12:13:10

2

閱讀本文可能有幫助,但從我知道如果有析構函數/ Finalize它將被稱爲其他GC將siply釋放內存。

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

+0

我讀過這個,如果沒有析構函數,那麼GC不會調用析構函數。但是它會調用Finalize嗎?有沒有辦法檢查它? – 2010-04-15 12:14:31

+0

@isthatacode如果你實現了析構函數,它將被調用。如果不是,則釋放內存。 – AndrewC 2010-04-15 12:16:32

+0

@isthatacode:析構函數只是一個用來覆蓋'Finalize'的特殊語法。 – LukeH 2010-04-15 12:22:20

2

如果對象沒有析構那麼它不被添加到在所述第一位置終結隊列,所以GC將簡單地釋放存儲器等時,它清除。

GC只調用終結隊列中對象的析構函數/終止代碼。

+0

@Luke - 謝謝,這是有道理的。 – 2010-04-15 13:44:48

1

這是少的可憐。對所有「一無所知」回答這個問題的人們都感到羞恥,也沒有真正回答這個問題。

這裏是你的答案:

這種方法,除非對象已經最後確定到SuppressFinalize調用被豁免自動對象變得不可訪問後調用。在應用程序域關閉期間,Finalize會自動調用到不能完成的對象,即使那些仍然可以訪問的對象。 Finalize在給定實例上只會自動調用一次,除非對象使用ReRegisterForFinalize和GC.SuppressFinalize之類的機制重新註冊。

來自:

http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

+2

@gmagana:你自己的回答是誤導性的:'Finalize'方法只對添加到最終化隊列中的對象(也就是那些覆蓋'Finalize'方法的對象)被調用。 – LukeH 2010-04-15 12:30:59

+0

是的,對於試圖幫助的人感到羞恥。 – AndrewC 2010-04-15 12:53:36

+0

@ gmagana-謝謝你的回覆。我認爲我們不應該在這裏使用侮辱性語言。 – 2010-04-15 12:59:08

0

can't call a destructor in C#,本身。它們被自動調用。

您可以實例化一個新的對象,只要所有的資源進行管理(讀:沒有實現IDisposible),它會被垃圾收集時:

  • 垃圾收集器決定運行
  • 沒有引用保持,即指向對象

對於實現IDisposible類,最好的辦法是來包裝他們的使用在using聲明,這將確保Dispose()方法在對象超出範圍時調用。

推薦閱讀

相關問題