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

本文关键字:调用 析构函数 C#XNA | 更新日期: 2023-09-27 17:58:30

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

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

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

顺便说一句,如果对象是你经常创建的东西(敌人、子弹等),那么你可能想使用池而不是删除对象。这意味着对象被回收,因此,垃圾收集器的调用频率会降低,这将提高性能。

虽然您的里程可能会有所不同,但我更喜欢使用不再需要的对象的IDisposableDispose()。当您使用非托管资源,但设置了Dispose()声明意图时,尤其如此。

有关如何实现IDisposable的好示例,请参阅GC.SuppressFinalize上的此资源。

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

将对此对象的引用设置为null

将对象设置为null后,如果出于某种原因想要立即收集对象,请调用GC.Collect()

什么样的对象?如果是一次性/IDisposable,则应该调用对象。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的对象。或者使用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;