3

在 C# 中,我习惯于清除对我的自定义事件的每个订阅,Dispose()以避免订阅者忘记取消订阅我的事件而导致内存泄漏。

这很简单,只需调用即可,MyEvent = null因为 C# 编译器会自动生成一个委托字段。不幸的是,在 VB.NET 中,似乎没有简单的方法可以做到这一点。我想出的唯一解决方案是编写一个Custom Event,添加自定义添加和删除处理程序调用Delegate.Combine/ Delegate.Remove,基本上是 C# 编译器所做的。但是,为了能够清除订阅而必须为每个事件执行此操作对我来说似乎有点“矫枉过正”。

有没有人有其他想法来解决这个问题?谢谢。

4

2 回答 2

6

在 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方法中列出。

于 2009-11-10T12:25:29.367 回答
0

我对 VB.NET 的了解很模糊,但是 AddHandler / RemoveHandler 呢?

于 2009-11-10T10:39:02.357 回答