2014-04-12 33 views
4

我有一個問題。我是計算機科學的一年級學生。通常我在課堂上很好奇,但並不總是我的老師有答案,或者並不總是知道答案。 C#中析構函數是否必要?我的意思是,如果我必須像構造函數一樣執行析構函數方法,那麼這是一種好的做法,還是我可以避免它,垃圾回收器會爲我做這件事?是C#中必要的析構函數嗎?

+0

取決於如果你的對象管理的資源或沒有(打開的文件,插座,需要明確的清理其他對象)。 –

+0

C#是一種垃圾收集語言。你不需要擔心自己清理。 –

回答

12

破壞者(或終結者)在語言中是很好的 - 但你幾乎應該從來沒有使用它們。基本上,如果你有一個非託管資源直接手柄,不僅是數量極其稀少,但使用SafeHandle作爲間接的微小水平是一個更好的主意,反正你只需要他們(負責處理清理你) 。有關更多詳細信息,請參見Joe Duffy's blog post on the topic

對於它的價值,我不記得上一次我寫以外的其他測試一些奇怪的行爲或其他終結。

對於絕大多數的時候,生活是簡單的:

  • 如果您使用的非託管資源(例如文件)的方法中的垃圾收集器處理內存資源清理
  • 本地,使用一個using語句,以確保你釋放它,當你用它做
  • 如果你需要你的類型中的引用(實現IDisposable或其他任何東西)的非託管資源作爲實例變量,你的類型應該本身imple IDisposable。 (我會盡量避免這種在可能的情況。即使需要,你可以讓生活更簡單的通過使你的類sealed,此時你至少不用擔心其他子類具有更加不受管理狀態清潔了。)
+2

+1另一個偉大的職位。 – Christos

+0

感謝大家的解釋。向成功人士學習很好。很好的答案。 – blade

3

沒有析構函數不是C#neccesary。之所以如此,是因爲在C#中,內存是自動管理的,除了創建對象之外,您無需執行任何操作。當垃圾收集器驗證某個對象沒有在應用程序中的任何其他地方被引用時,它就會回收它的內存,而不必爲此對象聲明任何析構函數,就像我們在C++中所做的那樣。

+0

您如何提出在C#中編寫非託管代碼? –

+0

啊,並沒有提到IDisposable。對不起,我說,但內存管理不幫助非託管資源。 – TomTom

+0

@JonSkeet我不認爲這是寫在C#非託管代碼一個很好的做法,但我知道,我認爲我們必須寫非託管代碼在C#中的選擇可能是錯誤車道。 – Christos

2

沒有在任何語言是不必要的。他們服務他們的目的。

析構函數會破壞對象,你會復活對象結束。(如果您嘗試訪問遭到破壞的對象,你可能會得到一個錯誤

GC將自動爲您當對象做到這一點已經不再提及它了。因此,有沒有必要讓你明確地做..

此外,實施IDisposable應給予了析構函數的偏好。

相關問題