有没有办法清除VB.NET中事件的订阅?
在C#中,我习惯于在有没有办法清除VB.NET中事件的订阅?,vb.net,events,subscription,Vb.net,Events,Subscription,在C#中,我习惯于在Dispose()中清除对自定义事件的所有订阅,以避免订阅方忘记取消订阅我的事件而导致内存泄漏 这非常简单,只需调用MyEvent=null,因为C#编译器会自动生成一个委托字段。不幸的是,在VB.NET中,似乎没有简单的方法来实现这一点。我提出的唯一解决方案是编写一个自定义事件,添加调用委托的自定义添加和删除处理程序。合并/委托。删除,基本上就是C编译器所做的。但在我看来,每次活动都必须这样做,才能清除订阅似乎有点“矫枉过正” 有人有别的办法解决这个问题吗?谢谢。我对VB.
Dispose()
中清除对自定义事件的所有订阅,以避免订阅方忘记取消订阅我的事件而导致内存泄漏
这非常简单,只需调用MyEvent=null
,因为C#编译器会自动生成一个委托字段。不幸的是,在VB.NET中,似乎没有简单的方法来实现这一点。我提出的唯一解决方案是编写一个自定义事件
,添加调用委托的自定义添加和删除处理程序。合并
/委托。删除
,基本上就是C编译器所做的。但在我看来,每次活动都必须这样做,才能清除订阅似乎有点“矫枉过正”
有人有别的办法解决这个问题吗?谢谢。我对VB.NET只有模糊的了解,但是AddHandler/RemoveHandler呢?在VB.NET中完全一样。每个事件的编译器,就像C#编译器一样,但在VB中该字段是隐藏的。但是,您可以从代码中访问变量-它始终命名为XXXEvent,其中XXX是事件名称 因此,您可以轻松地清除对事件的订阅,就像在C中一样:
我还认为应该可以使用反射自动找到所有隐藏的委托变量,并清除它们。那么它们就不必在
Clear
方法中列出。AddHandler/RemoveHandler是C#中+=和-=的VB.NET等价物。因为我不知道每个订阅者(除非我自定义了事件),所以我无法删除每个订阅者。谢谢!没有看到文档部分,非常有用。在使用反射时,仅仅将一些变量设置为null似乎很麻烦;但在调试时断言每个字段都正确地设置为null是非常有用的。我在想,可能会有一个通用方法ClearAllSubscriptions,它使用反射来处理任何类型:那么Clear方法中所需要的就是ClearAllSubscriptions Me
Public Class Class1
Implements IDisposable
Event MyEvent()
Sub Clear() Implements IDisposable.Dispose
Me.MyEventEvent = Nothing ' clear the hidden variable '
End Sub
End Class