有没有什么办法来清除订阅VB.NET中的事件吗?
-
19-09-2019 - |
题
在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?
不隶属于 StackOverflow