在C#中,我习惯于清除Dispose()
中每个订阅自定义事件的习惯,以避免订阅者忘记取消订阅我的事件而导致内存泄漏。
这很简单,只需调用MyEvent = null
,因为C#编译器会自动生成委托字段。不幸的是,在VB.NET中,似乎没有简单的方法可以做到这一点。我提出的唯一解决方案是编写Custom Event
,添加自定义添加和删除处理程序,调用Delegate.Combine
/ Delegate.Remove
,基本上是C#编译器的功能。但是为了能够清除订阅而必须为每个事件执行此操作似乎对我来说有点“过分”。
有没有人有另一个想法来解决这个问题?感谢。
答案 0 :(得分:6)
在VB.Net中完全相同。每个事件的编译器automatically creates a delegate field,就像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
方法中。
答案 1 :(得分:0)
我对VB.NET只有模糊的知识,但是AddHandler / RemoveHandler呢?