在vb.net中,如果我使用AddHandler,我是否必须使用RemoveHandler?

时间:2011-09-15 19:01:10

标签: vb.net memory-management

如果我总是需要在使用AddHandler之后调用RemoveHandler,那么最好的位置在哪里?

我已经搜索了几个类似的问题如下,但我不太明白。

When and where to call the RemoveHandler in VB.NET?

AddHandler/RemoveHandler Not Disposing Correctly

我认为c#或vb.net中的垃圾收集会处理未使用的对象。此外,在vb.net设计器中,它会自动生成Dispose Sub。所以我根本不注意以编程方式释放资源。我有任何内存泄漏问题吗?请为我提供一些链接/文件,让我开始学习。

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If
    Finally
        MyBase.Dispose(disposing)
    End Try
End Sub

非常感谢!

1 个答案:

答案 0 :(得分:11)

  

如果我总是需要在使用AddHandler之后调用RemoveHandler,那么最好的位置在哪里

您不一定要这样做。

如果您的源对象(具有该事件的对象)将比您的订阅者更长,您通常只需要担心调用RemoveHandler。如果你在一个表单中工作,那么处理的表单将阻止源再次引发事件,并且两个对象都将超出范围并且(最终)被垃圾收集,因此你没有问题。

如果你在一个长期存在的对象上订阅一个事件,那么这个问题会出现更多,这个对象会在长期存在的对象之前“消失”。即使使用垃圾收集器,这也可能导致内存泄漏。在这种情况下,您需要在听完事件后调用RemoveHandler。但是,对于何时发生这种情况,没有单一的指导,因为它取决于相关事件和您的应用程序逻辑。