【问题标题】:How to dispose a class properly?如何正确配置类?
【发布时间】:2014-08-19 20:07:47
【问题描述】:

VB.Net 2010。我有一个带有计时器和其他一些东西的课程,即

Public Class PlayerClass
    Inherits BodyClass

    '//Variables For TCP/IP Functions
    Public Property ClassInstance As UserClass
    Private Account As String
    Private IP As String
    Private HungerTimer As Timer

    Public Property LeftGrip As WeaponClass
    Public Property RightGrip As WeaponClass

    Public Sub New(....blahblah..)
     ...stuff
     ...
    End Sub
End Class

创建类时,我会初始化所有内容(New Timer()、New WeaponClass(datahere) 等)。

我在正确处置方面遇到问题。我发现将已初始化的类设置为空并不能正确处理它,因为计时器一直在运行,而且我猜当 GC 出现时内存没有被释放。

我一直在网上阅读,但我很困惑,因为很多人都有很多答案。我是否改为调用 .Dispose() ?我是否必须停止计时器并处置它们,或者只是处置(如果那样的话)?我是否处置其他类,如“LeftGrip”和“RightGrip”?

所以主要想知道这里最好的方法是什么。公共财产/私人财产是否完全处置?

谢谢!

【问题讨论】:

  • 从您的问题中我无法判断计时器是否需要在应用程序期间持续存在,或者它们是否只使用了很短的时间然后可以释放。我知道你问的是发布,但这真的是你想做的吗?
  • 对你的应​​用程序运行代码分析,VS 会告诉你在哪里以及为什么要实现 IDispose。在大多数情况下,它只在涉及非托管资源时才重要。
  • .Net 框架中有几个 Timer 类 - 准确了解您正在使用的类可能会有所帮助。
  • 抱歉,将是“导入 System.Timers”,然后将其称为“作为计时器”.. System.Timers.Timer

标签: .net vb.net dispose


【解决方案1】:

只需遵循 .NET 指导即可。如果一个类有任何成员是一次性的,那么它应该自己实现 IDisposable。像这样:

Public Class PlayerClass
    Inherits BodyClass
    Implements IDisposable

    Public Sub Dispose() Implements IDisposable.Dispose
        HungerTimer.Dispose()
    End Sub

    '' etc...
End Class

因此,当您使用完 PlayerClass 对象后,您可以简单地处理它,并且计时器也会停止计时。 非常小心使用 System.Timers.Timer,这是一个非常讨厌的类。一方面,它仍然可以触发您编写的 Elapsed 事件处理程序,即使您处置了计时器。另一方面,它的 Elapsed 事件在工作线程上运行,因此您必须非常小心地处理播放器对象。在游戏中,您几乎总是喜欢使用同步计时器。最常见的情况是游戏时钟超时,因此暂停游戏之类的操作变得非常容易实现。

【讨论】:

  • 对于同步计时器,在这种情况下您将如何实现它?我了解使用游戏时钟来处理计时器,但它是否会不使用实际的 system.timers 计时器,例如在处理它并检查所需时间的初始循环中添加一些东西(如 Update() 函数)开火 vs 游戏时钟滴答声?
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2017-05-18
  • 2018-05-27
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多