如何在C#XNA中调用析构函数
本文关键字:调用 析构函数 C#XNA | 更新日期: 2023-09-27 17:58:30
我有一个对象,只想在某个事件中销毁它。如何在XNA中调用析构函数?
将对象设置为null
,垃圾收集器将在下次运行时拾取它。
顺便说一句,如果对象是你经常创建的东西(敌人、子弹等),那么你可能想使用池而不是删除对象。这意味着对象被回收,因此,垃圾收集器的调用频率会降低,这将提高性能。
虽然您的里程可能会有所不同,但我更喜欢使用不再需要的对象的IDisposable
和Dispose()
。当您使用非托管资源,但设置了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;