2010-03-09 43 views
12

任何人都可以請告訴我如何在C#中釋放對象? 例如,我有一個對象:我如何在C中自由對象#

Object obj1 = new Object(); 
//Some code using obj1 
/* 
Here I would like to free obj1, 
after it is no longer required 
and also more importantly 
its scope is the full run time of the program. 
*/ 

感謝您的幫助

回答

7

你不必。你只需停止引用它們,垃圾收集器就會(在某個時候)爲你釋放它們。

您應該對使用非託管資源的類型執行IDisposable,並在using語句中包裝實現IDisposable的任何實例。

+2

或者只是使用C++/CLI來代替,所以您不必記住哪些類型實現了IDisposable,哪些不實現,當對象超出作用域時它將自動調用Dispose(如果未聲明爲句柄) – 2010-03-09 05:23:37

+4

幾乎沒有令人信服的理由使用C++/CLI! :) – 2010-03-09 05:37:39

+0

@ Ben Voigt如果你正確實現了IDisposable,那麼Dispose函數在C#中超出範圍時也會被調用。 – 2010-03-09 07:33:50

0

你停止引用它們並讓垃圾收集器帶走它們。

當你想釋放對象,添加以下行:

obj1 = null;

的垃圾收集器,如果隨意刪除對象(前提是沒有其他指向對象的指針,保持它活着)

+1

不要打擾零參考,除非參考是靜態的。引用最終將超出範圍,這將使實例符合垃圾回收的條件。 – 2010-03-09 05:30:42

16

你不需要。運行時的垃圾回收器會出現併爲您清理它。這就是爲什麼你使用的是C#,而不是託管C++在首位:)

+0

只有當對象不再有引用(或鏈接)時,GC纔會清理它,或者當GC檢測到某個點之後該對象完全沒有被代碼使用時(即使它的作用域是說整個人的方法,因爲它的壽命將是程序的全部運行時間)? – assassin 2010-03-09 06:19:11

+1

@assasin:當沒有引用時,收集它。 GC不會編譯器的工作。所以如果有參考資料,即使將來不會使用,也不能收集。這就是爲什麼我們必須小心靜態物體。但在你的主要方法例子中,這取決於。來自堆棧的引用具有主要範圍。但是它們指向的對象可能會取決於您的引用是否被重新分配。 – Fakrudeen 2010-03-09 08:21:53

1

可以使用using聲明。在範圍之後,對象的引用將被刪除,並且垃圾收集器可以在稍後收集它。

+3

這僅適用於實現IDisposable的對象 – Arve 2010-03-09 05:13:05

5

你不知道。這是垃圾收集器自動執行的操作 - 基本上,當.NET運行時需要內存時,它會繞過並刪除不再使用的對象。

你需要做的就是去除對象的所有線段。

在你的情況....

obj1 = null;

最後,那麼該對象不再被引用,並可以從垃圾收集器中聲明。

您可以檢查http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)瞭解更多詳情。請注意,如果對象引用非託管資源(如打開文件等),它應該實現Disposable模式(IDisposable接口),並且當您不再需要該對象時,您應該明確地釋放這些引用。

+2

不需要執行obj1 = null; – 2010-03-09 05:13:11

+1

我打算建議分配給null,但有一點閱讀說可以實際*延遲*在C#垃圾回收。多麼有趣。有關更多關於爲什麼不應將其分配給C#中的null的更多信息,請參閱本文:http://blogs.msdn.com/csharpfaq/archive/2004/03/26/97229。aspx – 2010-03-09 05:13:58

+0

這個問題的一個問題是當你調用另一個進程中的COM對象時。另一個進程將會得到經典的「COM服務器警告」對話框,因爲C#允許引用逗留。我很確定設置對null的引用在處理時會產生影響。 – 2013-09-10 12:32:10

3

它不建議,但如果你真的需要,可以通過強制垃圾回收:

GC.Collect(); 
+9

不建議調用GC.Collect。見http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx – Arve 2010-03-09 05:19:12

+4

建議有人打電話GC.Collect()是不好的建議國際海事組織。 – 2010-03-09 05:37:00

0

正如其他人所說,你並不需要顯式地釋放他們;但是沒有提到的是,雖然內置的垃圾收集器會爲你釋放它們,但無法保證垃圾收集器什麼時候釋放它。

所有你知道的是,當它已經超出了範圍,它可以被GC清理,並在某個階段。

0

GC將收集所有非託管資源。

非託管資源應執行IDisposable。如果您使用的對象實現了IDisposable,那麼您應該在不再需要該對象的方法時調用對象的Dispose()方法,或者在using語句中包裝其實例。