我有一個問題。我是計算機科學的一年級學生。通常我在課堂上很好奇,但並不總是我的老師有答案,或者並不總是知道答案。 C#中析構函數是否必要?我的意思是,如果我必須像構造函數一樣執行析構函數方法,那麼這是一種好的做法,還是我可以避免它,垃圾回收器會爲我做這件事?是C#中必要的析構函數嗎?
4
A
回答
12
破壞者(或終結者)在語言中是很好的 - 但你幾乎應該從來沒有使用它們。基本上,如果你有一個非託管資源直接手柄,不僅是數量極其稀少,但使用SafeHandle
作爲間接的微小水平是一個更好的主意,反正你只需要他們(負責處理清理你) 。有關更多詳細信息,請參見Joe Duffy's blog post on the topic。
對於它的價值,我不記得上一次我寫以外的其他測試一些奇怪的行爲或其他終結。
對於絕大多數的時候,生活是簡單的:
- 如果您使用的非託管資源(例如文件)的方法中的垃圾收集器處理內存資源清理
- 本地,使用一個
using
語句,以確保你釋放它,當你用它做 - 如果你需要你的類型中的引用(實現
IDisposable
或其他任何東西)的非託管資源作爲實例變量,你的類型應該本身impleIDisposable
。 (我會盡量避免這種在可能的情況。即使需要,你可以讓生活更簡單的通過使你的類sealed
,此時你至少不用擔心其他子類具有更加不受管理狀態清潔了。)
3
2
沒有在任何語言是不必要的。他們服務他們的目的。
析構函數會破壞對象,你會復活對象結束。(如果您嘗試訪問遭到破壞的對象,你可能會得到一個錯誤)
GC將自動爲您當對象做到這一點已經不再提及它了。因此,有沒有必要讓你明確地做..
此外,實施IDisposable
應給予了析構函數的偏好。
相關問題
- 1. C++需要析構函數
- 2. C:中的遞歸函數總是有必要的嗎?
- 3. 在C++中,構造函數和析構函數可以是內聯函數嗎?
- 4. Visual C#中沒有析構函數嗎?
- 5. Java中有C++析構函數嗎?
- 6. 是否有必要在對象析構函數中調用「string」成員的析構函數?
- 7. C中的析構函數#
- 8. C++中的析構函數
- 9. C++中的析構函數
- 10. C++中總是需要調用基類構造函數嗎?
- 11. C++中的構造函數和析構函數與C#比較
- 12. C中的析構函數和構造函數C
- 13. 什麼時候必須要在C++類中定義析構函數,爲什麼?
- 14. 圖C中的ADT析構函數C
- 15. 構造函數和析構函數 - C++
- 16. C++類構造函數/析構函數
- 17. C++:不內聯時,構造函數/析構函數未解析嗎?
- 18. C++中構造函數,複製構造函數,析構函數序列中的額外析構函數
- 19. 空的構造函數的必要性
- 20. C++的析構函數
- 21. Python&C#:IronPython是絕對必要的嗎?
- 22. 調用java.lang.Object構造函數真的有必要嗎?
- 23. 沒有析構函數的C++函數
- 24. 需要確保構造函數/析構函數被調用一次。但「錯誤:析構函數是私有的」
- 25. 我是否需要刪除析構函數中的基本數據類型? C++
- 26. C++ 2構造函數和類中的析構函數
- 27. C++中構造函數和析構函數的內聯使用
- 28. 是規定必須有默認的構造函數在C++中
- 29. C++中的析構函數調用
- 30. C++中的析構函數和繼承?
取決於如果你的對象管理的資源或沒有(打開的文件,插座,需要明確的清理其他對象)。 –
C#是一種垃圾收集語言。你不需要擔心自己清理。 –