在C#中,我把这个习惯在每次结算订阅我的自定义事件Dispose()避免用户忘记从我的事件退订的内存泄漏。

这是很简单的事,简单地通过调用MyEvent = null因为C#编译器自动生成一个代表字段。不幸的是在VB.NET,似乎有没有简单的方法来做到这一点。我想出了是写一个Custom Event唯一的解决办法,添加自定义添加和移除处理程序调用Delegate.Combine / Delegate.Remove,在C#编译器基本上是什么。但不必为每一个事件这样做只是为了能够清除订阅似乎有点“矫枉过正”给我。

有没有人有另一种思路来解决这个问题?感谢。

有帮助吗?

解决方案

这正是在VB.Net相同。编译器自动为每个事件的委托场 ,就像C#编译器,但在VB中的字段是隐藏的。但是你可以从你的代码中访问该变量 - 它总是被命名为XXXEvent,其中XXX是事件名称。

所以,你可以轻松地清除订阅的事件,就像在C#:

Public Class Class1
  Implements IDisposable
  Event MyEvent()

  Sub Clear() Implements IDisposable.Dispose
    Me.MyEventEvent = Nothing ' clear the hidden variable '
  End Sub
End Class

我也想应该可以使用反射来自动查找所有隐藏的代理变量,并清除它们。然后,他们不必在Clear方法中列出。

其他提示

我只拿到了VB.NET的模糊的认识,但怎么样的AddHandler / RemoveHandler?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top