如何在C#XNA中调用析构函数

时间:2011-06-07 17:43:59

标签: c# xna destructor

我有一个对象,只想在某些事件上销毁它。如何在XNA中调用析构函数?

7 个答案:

答案 0 :(得分:6)

将对象设置为null,垃圾收集器将在下次运行时将其拾取。

作为旁注,如果对象是你经常创建的东西(敌人,子弹等......),那么你可能想要使用pool而不是删除对象。这意味着对象被回收,因此,垃圾收集器的调用次数减少,这将提高性能。

答案 1 :(得分:3)

虽然您的里程可能会有所不同,但我的偏好是使用IDisposableDispose()我不再需要的物品。这是特别的。当您使用非托管资源时,如果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;