我有一個對象,只是想在某些事件中銷燬它。如何在XNA中調用析構函數?如何在C#中調用析構函數XNA
回答
將對象設置爲null
垃圾收集器會在下次運行時將其拾取。請注意,如果對象是經常創建的東西(敵人,子彈等),那麼您可能需要使用pool而不是刪除對象。這意味着對象被回收,因此垃圾收集器不經常被調用,這會提高性能。
將此對象的引用設置爲null
。
將對象設置爲null
後,如果因某種原因需要立即收集對象,請撥打GC.Collect()
。
不是很好的通用建議。調用GC.Collect並不保證它會立即收集,實際上最終可能會產生比它更值得的更多問題。 – 2011-06-07 17:50:08
@Gregory來自MSDN的Beamer從'GC.Collect':_「強制所有時代的即時垃圾收集。」_。當然,全部取決於是否應該調用GC.Collect。例如。如果一個對象消耗了大量應該儘可能快地釋放的內存,'GC.Collect'是有用的。 – Centro 2011-06-07 18:00:17
讓我匆忙陳述我的言論。 GC不能保證清潔任何物體。我喜歡Rico的垃圾收集規則:http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx – 2011-06-07 18:49:23
雖然你的里程可能會有所不同,但我的偏好是使用我不再需要的對象的IDisposable
和Dispose()
。這是特別的。如果使用非託管資源,但設置聲明爲Dispose()
,則爲true。
有關如何實施IDisposable
的很好示例,請參閱GC.SuppressFinalize
上的此資源。
http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
除了僅使用Dispose之外,您可以繼續並遵循Disposable模式所以你可以隨意釋放對象,但是如果它超出了範圍,它會被GC處理。 – 2011-06-07 17:54:01
什麼樣的對象?如果是Disposable/IDisposable,你應該調用object.Dispose() 否則,你可以使用object = null,它將被自動清理。這不是C你正在工作;)
如果你的'對象'實際上是一個複雜的類或其中有更多的對象,你可能要考慮使它成爲一個IDisposable類。
如果對象包含任何非託管資源,則執行IDisposable
(並在完成後使用using
或調用Dispose()
)。
如果它不包含非託管資源,那麼當沒有更多引用時,垃圾回收器會「在某個時間點」聲明它。
GC.Collect()將使垃圾收集器收集,如果沒有對它的引用,它將「銷燬」你的對象。這不是一個好主意,因爲它具有性能影響(需要時間並將其他對象推向更高一代,使得它們在被回收之前在內存中持續更久)。
爲什麼你需要在某個固定時間銷燬的物體?
如果您自己正在處理清理操作,您想要做的是致電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;
- 1. C++析構函數沒有被調用?
- 2. C++析構函數和調用順序
- 3. C++析構函數早期調用
- 4. C++析構函數太早調用
- 5. 如何調用所有析構函數?
- 6. 複製構造函數調用析構函數C++
- 7. 在c#中析構函數的使用?
- 8. C++中構造函數的調用不等於C++中析構函數的調用次數
- 9. 析構函數在C++
- 10. 析構函數LinkedListelement在C++
- 11. C++中的析構函數
- 12. C++中的析構函數
- 13. C中的析構函數#
- 14. 如何調用結構函數(C++)
- 15. 在C++中緩慢遞歸析構函數調用
- 16. 什麼時候在C++中調用析構函數?
- 17. 在C++中拋出後調用析構函數嗎?
- 18. 在C++中調用的構造函數
- 19. 構造函數不在C++中調用
- 20. 構造函數和析構函數 - C++
- 21. 如何在結構中調用函數?
- 22. 如何在其他構造函數中調用構造函數?
- 23. Botan :: SecureVector - 構造函數中調用的析構函數?
- 24. 調用可以在C++中拋出異常的函數的析構函數
- 25. new []/delete []並在C++中拋出構造函數/析構函數
- 26. 析構函數不在C++中執行
- 27. C中的析構函數和構造函數C
- 28. C++中的構造函數和析構函數與C#比較
- 29. 成功調用析構函數或調用empy析構函數後出現Seg錯誤。 C++
- 30. 如何在c#中調用受保護的構造函數?
OMG,那是過去的事情,你想在.NET中做 – 2011-06-07 17:48:15
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
它的工作方式不是這樣...... – Nasgharet 2011-06-07 17:50:51