2010-08-06 34 views

回答

7

不。每個正常的受管.NET對象在您停止引用時都會收集垃圾。 IDisposable意味着你將實現一個需要被調用者調用的Dispose()方法 - 它通常會釋放不被垃圾收集的東西。它也有助於確定釋放記憶的地方。

退房IDisposable模式,以確保你做正確的事:

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx

+0

感謝您的回覆。因此,如果我有一個類A並且它的一個公共函數創建了像Bitmap這樣的非託管對象並調用了BitMap.Dispose(),那麼它將被垃圾回收還是類A保持對位圖的引用? – kishore 2010-08-06 20:49:56

+0

當您調用Dispose()時,它將被處理掉(該對象現在不可用)。如果你沒有,GC最終會得到它,如果它寫得正確(它是),那麼Finalize將調用Dispose()。但是,調用Dispose()是必需的(使用using語句自動執行)。 – 2010-08-06 22:17:22

+0

另外,除非需要,否則您絕對不應該實施IDisposable。它使得GC不得不處理它們(記住調用Finalize等)。如果您擁有一次性或非託管資源的財產,那麼請執行它。 – 2010-08-06 22:19:14

3

不,每個對象都會自動處理。

當您在對象解構中做某種特殊操作時,IDisposable可用。例如,如果在對象工作期間鎖定某些資源(如文件等),則可以在Dispose方法中釋放它們。

1

當您要在代碼中使用文件流等本機資源時,必須使用IDisposable。出於所有其他目的,.Net垃圾回收器做得很好。

簡單地實現IDisposable不會強制垃圾收集。需要顯式調用Dispose方法來清理任何本地資源。

編輯:我會建議您瀏覽Jeff Richter的ClR via C#中的Garbage Collection章節。

1

不可以。您的用戶定義的類是垃圾收集,當它不在任何地方引用時。你可以通過做classObject = null來強制執行此操作。如果這是當前引用classObject的應用程序的最後部分,則垃圾回收將清除其內存。

IDisposable主要用於您可以通過using()方法組織垃圾收集活動。

1

不,它不需要。方法Dispose()設計用於做額外的工作,處理不再使用該對象時必須處理的資源。請記住,垃圾收集可能會在對象丟失最後一次引用後很長時間發生。

IDisposable使用你應該處理的對象,當你與FX using做過類似

using (SomeClassWithDisp object = new SomeClassWithDisp()) 
{ 
    //Use the object 
} 

此外,見:

What is the difference between using IDisposable vs a destructor in C#?

1

你實現的Dispose()方法來明確地釋放非託管資源(文件,流,柄等)到你的對象持有參考。

想法是,您將通過調用dispose方法儘快釋放這些資源。 dispose()方法不會立即在對象上運行垃圾收集,而是釋放資源並允許垃圾收集器在方便時執行它的操作。