2010-09-06 61 views
7

我對使用c#中的析構函數有點困惑。在我的知識中,我們不能根據我的意願調用 析構函數,它會在垃圾回收器之前自動調用以執行類(對象)的某些工作,所以我想問我們是否在c#中使用析構函數,然後我們需要垃圾回收器。據我所知,析構函數可以照顧內存,那麼爲什麼我們需要垃圾收集器?在c#中析構函數的使用?

回答

14

Everybody thinks about garbage collection the wrong way

一個正確編寫的程序不能 認爲終結將永遠運行。

+0

+1目前爲止最好的答案,而且是唯一一個確實正確的答案。充其量,您在終結器中調用了Dipose(),以免Dispose()被程序中的其他代碼手動調用。 – siride 2010-09-06 05:04:37

+0

偉大的話語。已將該文章添加到書籤 – zerkms 2010-09-06 05:13:38

+1

另外,Unmesh鏈接的文章是非常神的資源,http://msdn.microsoft.com/en-us/magazine/cc163392.aspx。網絡上還有很多其他文章提到'Dispose(bool disposing)'模式,沒有真正解釋'本地'和'管理'資源之間的區別。我見過很多不需要實現模式來處理託管*資源的類。 – 2010-09-06 05:15:48

2

析構函數不用於清理託管內存。這就是垃圾收集器的用途。析構函數用於清理其他資源,如句柄。

我建議你看看CLR via C#瞭解這個工作原理的細節。

3

我認爲讀取您的almost duplicate topic是基於您對垃圾收集器的工作方式沒有很好的理解。以非常直截了當的方式,它是在後臺運行的自己的服務,它在應用程序的整個生命週期中跟蹤和釋放未使用和處置的對象的內存。實際上,你應該從來沒有必須自己調用GC,除非在非常罕見和特殊情況下。

的desctructors被用於清理和不能被垃圾收集器被釋放自由非託管資源,請參閱本MSDN page關於析構函數的更多信息。

+1

+1對於大聲說出最好的建議可能是刷新他關於內存管理,垃圾回收和本機資源的知識/在.NET中處理 – 2010-09-06 05:11:32

1

我認爲這裏的混淆來自事實上,你可以以確定性和非確定性的方式處理對象(即當GC開始這樣做時)。

爲了回答你爲什麼需要GC的問題,我會說,即使拋開內存泄漏,GC是非常高效的,並且要求立即回收內存可能實際上降低了總體性能系統。它與單線和多線程辯論類似。

0

C#中的析構函數應該很少使用。但是,在某些情況下,你別無選擇。

例如,如果您有一個用於日誌記錄的單例類,並且出於性能方面的原因,您不能使用自動刷新,應該考慮在單例終止期間刷新緩衝區。