我有一个对象,只想在某些事件上销毁它。如何在XNA中调用析构函数?
答案 0 :(得分:6)
将对象设置为null
,垃圾收集器将在下次运行时将其拾取。
作为旁注,如果对象是你经常创建的东西(敌人,子弹等......),那么你可能想要使用pool而不是删除对象。这意味着对象被回收,因此,垃圾收集器的调用次数减少,这将提高性能。
答案 1 :(得分:3)
虽然您的里程可能会有所不同,但我的偏好是使用IDisposable
和Dispose()
我不再需要的物品。这是特别的。当您使用非托管资源时,如果Dispose()
设置声明了意图,则为true。
在GC.SuppressFinalize
上查看此资源,了解如何实施IDisposable
的一个很好的示例。
http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
答案 2 :(得分:1)
将此对象的引用设置为null
。
答案 3 :(得分:0)
将对象设置为null
后,如果由于某种原因需要立即收集对象,请致电GC.Collect()
。
答案 4 :(得分:0)
什么样的物体?如果是Disposable / IDisposable,你应该调用object.Dispose() 否则,您可以使用object = null,它将自动“清理”。这不是你在工作的C;)
如果您的“对象”实际上是一个复杂的类或其中包含更多对象的东西,您可能需要考虑将其作为IDisposable类。
答案 5 :(得分:0)
如果对象包含任何非托管资源,请执行IDisposable
(并在完成后使用using
或在其上调用Dispose()
。
如果它不包含非托管资源,那么垃圾收集器会在没有更多引用的情况下“在某个时刻”声明它。
GC.Collect()将使垃圾收集器收集,如果没有对它的引用,它将“销毁”你的对象。这不是一个好主意,因为它具有性能影响(它需要时间并将其他对象提升到更高的一代,使它们在被回收之前在内存中持续更长时间。)
为什么你需要在某个固定的时间销毁对象?
答案 6 :(得分:0)
如果您自己处理清理工作,则要调用GC.SuppressFinalize()
...通常在GC.SuppressFinalize()
课程中使用IDisposable
。有关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
的对象。或者使用lambdas打破强大的引用。
有关使用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;