我不確定用戶定義的類對象是如何被垃圾收集的。我是否需要在每個類上實現IDisposable接口並調用其上的dispose()方法來釋放內存?是否每個用戶定義的類都需要實現IDisposable接口來獲取垃圾回收
回答
不。每個正常的受管.NET對象在您停止引用時都會收集垃圾。 IDisposable意味着你將實現一個需要被調用者調用的Dispose()方法 - 它通常會釋放不被垃圾收集的東西。它也有助於確定釋放記憶的地方。
退房IDisposable模式,以確保你做正確的事:
http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx
不,每個對象都會自動處理。
當您在對象解構中做某種特殊操作時,IDisposable可用。例如,如果在對象工作期間鎖定某些資源(如文件等),則可以在Dispose方法中釋放它們。
當您要在代碼中使用文件流等本機資源時,必須使用IDisposable。出於所有其他目的,.Net垃圾回收器做得很好。
簡單地實現IDisposable不會強制垃圾收集。需要顯式調用Dispose方法來清理任何本地資源。
編輯:我會建議您瀏覽Jeff Richter的ClR via C#中的Garbage Collection章節。
不可以。您的用戶定義的類是垃圾收集,當它不在任何地方引用時。你可以通過做classObject = null
來強制執行此操作。如果這是當前引用classObject
的應用程序的最後部分,則垃圾回收將清除其內存。
IDisposable
主要用於您可以通過using()
方法組織垃圾收集活動。
不,它不需要。方法Dispose()
設計用於做額外的工作,處理不再使用該對象時必須處理的資源。請記住,垃圾收集可能會在對象丟失最後一次引用後很長時間發生。
當IDisposable
使用你應該處理的對象,當你與FX using
做過類似
using (SomeClassWithDisp object = new SomeClassWithDisp())
{
//Use the object
}
此外,見:
What is the difference between using IDisposable vs a destructor in C#?
在.NET中,所有對象都應該被釋放從內存和垃圾收集器默認,只要他們不再被使用,所以你不需要在每個類上實現IDisposable,但是有一些備忘錄是很好的ry釋放機制,如析構函數或Dispose方法本身。
這是所使用的析構函數的一個很好的例子:http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm
你實現的Dispose()方法來明確地釋放非託管資源(文件,流,柄等)到你的對象持有參考。
想法是,您將通過調用dispose方法儘快釋放這些資源。 dispose()方法不會立即在對象上運行垃圾收集,而是釋放資源並允許垃圾收集器在方便時執行它的操作。
- 1. 如何確定我是否需要使用垃圾回收器?
- 2. 垃圾收集 - 是否需要?
- 3. 每100秒垃圾回收
- 4. 自定義鏈接列表實現垃圾收集
- 5. 需要java測試用例來測試MarkSweep垃圾回收器
- 6. 垃圾收集器如何確定對象是否是垃圾?
- 7. 垃圾回收Java類
- 8. PHP中是否有垃圾回收?
- 9. 是否收集垃圾價值類型?
- 10. ASP.NET:實現自定義MembershipProvider類是否需要您實現自定義Membership類?
- 11. 清理資源(垃圾回收,使用,IDisposable等)
- 12. 擴展已經實現接口的抽象類的類是否需要接口?
- 13. 爲什麼使用終結器的類需要多個垃圾回收循環?
- 14. ASP.NET垃圾回收:是否引用靜態類屬性危險?
- 15. 獲取實現接口的每個類的實例
- 16. 擴展一個類(實現接口)並實現相同的接口不需要類中的方法定義?
- 17. 客戶端使用WCF服務是否需要接口定義?
- 18. java垃圾回收
- 19. Java:垃圾回收
- 20. Python垃圾回收
- 21. C#垃圾回收
- 22. Erlang垃圾回收
- 23. java - 垃圾回收
- 24. JDBC垃圾回收
- 25. JS垃圾回收
- 26. requestAnimationFrame垃圾回收
- 27. vb.net垃圾回收
- 28. ColdFusion垃圾回收
- 29. PhoneGap垃圾回收
- 30. Chrome垃圾回收
感謝您的回覆。因此,如果我有一個類A並且它的一個公共函數創建了像Bitmap這樣的非託管對象並調用了BitMap.Dispose(),那麼它將被垃圾回收還是類A保持對位圖的引用? – kishore 2010-08-06 20:49:56
當您調用Dispose()時,它將被處理掉(該對象現在不可用)。如果你沒有,GC最終會得到它,如果它寫得正確(它是),那麼Finalize將調用Dispose()。但是,調用Dispose()是必需的(使用using語句自動執行)。 – 2010-08-06 22:17:22
另外,除非需要,否則您絕對不應該實施IDisposable。它使得GC不得不處理它們(記住調用Finalize等)。如果您擁有一次性或非託管資源的財產,那麼請執行它。 – 2010-08-06 22:19:14