我有一个事件处理程序。 我在开始后 5 秒添加一个事件,如下所示:
AddHandler MyHandler, AddressOf DoStuff
现在,在处理整个表单时,我需要
Private Sub Unsubscribe()
RemoveHandler MyHandler, AddressOf DoStuff
End Sub
如果我在开始后 5 秒内关闭表单怎么办?当我尝试RemoveHandler
从未添加的内容时,这是一个问题吗?在 c# 中与+=
和-=
相同吗?
在一天结束时,这最终会使用MulticastDelegate
s,RemoveHandler
(VB( 或-=
(C#( 的操作是调用RemoveImpl
,返回:
如果在此实例的调用列表中找到
value
,则在其调用列表中没有value
的新委托;否则,此实例及其原始调用列表。
所以它很好。
(这将忽略自定义事件访问器,但这些访问器的任何实现都应尝试遵循相同的模式(
在我看来,无论之前是否称呼AddHandler
,都绝对可以拨打RemoveHandler
。
但是,如果您真的想取悦您的同事,那么您可以使用以下检查。我创建了一个WinForms表单,上面只有一个名为"Button1"的按钮。下面是背后的代码:
Public Event Test As EventHandler
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'AddHandler Me.Test, Function(sender2 As Object, e2 As EventArgs)
' Return Nothing
' End Function
If Me.TestEvent Is Nothing Then
MsgBox("No event handler attached, RemoveHandler not necessary")
Else
MsgBox(String.Format("{0} event handler(s) attached, RemoveHandler for all subscriptions necessary", Me.TestEvent.GetInvocationList.Count))
End If
End Sub
Microsoft为订阅的每个Event
创建一个EventHandler
对象,并将其命名为事件后跟"事件"(我的事件称为"Test",因此EventHandler
称为"TestEvent"(。
因此,如果EventHandler
Nothing
,该事件尚未订阅,如果尚未订阅,如果您尚未Nothing
,您甚至可以检查订阅频率。