我有一个事件处理程序。 我在开始后5秒钟添加了一个事件,如下所示:
AddHandler MyHandler, AddressOf DoStuff
现在处理整个表格时,我需要
Private Sub Unsubscribe()
RemoveHandler MyHandler, AddressOf DoStuff
End Sub
如果我在开始后5秒钟之前关闭表格怎么办?当我尝试从未添加过的RemoveHandler
时是否有问题?在c#中,+=
和-=
是否相同?
答案 0 :(得分:3)
最终,这将与MulticastDelegate
s一起工作,并且RemoveHandler
(VB)或-=
(C#)的操作是调用{{3} },它返回:
如果在此实例的调用列表中找到
value
,则在其调用列表中没有value
的新委托;否则,此实例及其原始调用列表。
很好。
(这会忽略RemoveImpl
,但是任何实现都应尝试遵循相同的模式)
答案 1 :(得分:0)
我认为,无论之前是否致电RemoveHandler
,致电AddHandler
都是绝对好的。
但是,如果您真的想因此而取悦您的同事,则可以使用以下支票。我创建了一个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为每个订阅的EventHandler
创建一个Event
对象,并将其命名为事件后跟“ Event”(我的事件称为“ Test”,因此EventHandler
称为“ TestEvent”。
因此,如果EventHandler
是Nothing
,则事件尚未预订;如果事件不是Nothing
,则您甚至可以检查事件的预订频率