2011-06-07 24 views

回答

6

將對象設置爲null垃圾收集器會在下次運行時將其拾取。請注意,如果對象是經常創建的東西(敵人,子彈等),那麼您可能需要使用pool而不是刪除對象。這意味着對象被回收,因此垃圾收集器不經常被調用,這會提高性能。

+2

OMG,那是過去的事情,你想在.NET中做 – 2011-06-07 17:48:15

+0

foreach(Kour dym in smokeList) { dym.ca s + = gameTime.ElapsedGameTime; (dym.cas> TimeSpan.FromSeconds(0.5)) { dym = null; 如果 } } – Nasgharet 2011-06-07 17:50:27

+0

它的工作方式不是這樣...... – Nasgharet 2011-06-07 17:50:51

1

將此對象的引用設置爲null

0

將對象設置爲null後,如果因某種原因需要立即收集對象,請撥打GC.Collect()

+0

不是很好的通用建議。調用GC.Collect並不保證它會立即收集,實際上最終可能會產生比它更值得的更多問題。 – 2011-06-07 17:50:08

+0

@Gregory來自MSDN的Beamer從'GC.Collect':_「強制所有時代的即時垃圾收集。」_。當然,全部取決於是否應該調用GC.Collect。例如。如果一個對象消耗了大量應該儘可能快地釋放的內存,'GC.Collect'是有用的。 – Centro 2011-06-07 18:00:17

+0

讓我匆忙陳述我的言論。 GC不能保證清潔任何物體。我喜歡Rico的垃圾收集規則:http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx – 2011-06-07 18:49:23

3

雖然你的里程可能會有所不同,但我的偏好是使用我不再需要的對象的IDisposableDispose()。這是特別的。如果使用非託管資源,但設置聲明爲Dispose(),則爲true。

有關如何實施IDisposable的很好示例,請參閱GC.SuppressFinalize上的此資源。

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx

+0

除了僅使用Dispose之外,您可以繼續並遵循Disposable模式所以你可以隨意釋放對象,但是如果它超出了範圍,它會被GC處理。 – 2011-06-07 17:54:01

0

什麼樣的對象?如果是Disposable/IDisposable,你應該調用object.Dispose() 否則,你可以使用object = null,它將被自動清理。這不是C你正在工作;)

如果你的'對象'實際上是一個複雜的類或其中有更多的對象,你可能要考慮使它成爲一個IDisposable類。

0

如果對象包含任何非託管資源,則執行IDisposable(並在完成後使用using或調用Dispose())。

如果它不包含非託管資源,那麼當沒有更多引用時,垃圾回收器會「在某個時間點」聲明它。

GC.Collect()將使垃圾收集器收集,如果沒有對它的引用,它將「銷燬」你的對象。這不是一個好主意,因爲它具有性能影響(需要時間並將其他對象推向更高一代,使得它們在被回收之前在內存中持續更久)。

爲什麼你需要在某個固定時間銷燬的物體?

0

如果您自己正在處理清理操作,您想要做的是致電GC.SuppressFinalize() ...通常您在IDisposable類中使用GC.SuppressFinalize()。看到這個代碼示例爲共同使用的IDisposable

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx

如果你真的需要把它收集垃圾的時候了:

var myObj = new MyObject(); 

// This object will be cleaned up by the Dispose method. 
// Therefore, you should call GC.SupressFinalize to 
// take this object off the finalization queue 
// and prevent finalization code for this object 
// from executing a second time. 
GC.SuppressFinalize(myObj); 

但是我提醒你,你應該讓物體超出範圍,並讓GC自然收集物體。只要你不嘗試去做它的工作,.NET運行庫在管理內存方面非常高效。

編輯

審查意見後,我看你忘了留下的一條重要信息,在你被綁定在問題到其他對象方法的對象。這意味着你正在試圖完成的對象不會最終確定,直到用於監視事件的方法已經完成,從而在內存中保留大量額外的對象。

你可以做什麼來打破這個強大的參考是使用一個名爲WeakReference的對象。或者使用lambda來打破強引用。

請參見本作使用了WeakReference的例子 http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

或者你也可以做這樣的事情:

dym.cas += (x, y, z) => gameTime.ElapsedGameTime(x,y,z); 

代替

dym.cas += gameTime.ElapsedGameTime;