当我尝试删除从未添加的处理程序时会发生什么?

时间:2018-09-10 12:56:56

标签: .net

我有一个事件处理程序。 我在开始后5秒钟添加了一个事件,如下所示:

AddHandler MyHandler, AddressOf DoStuff

现在处理整个表格时,我需要

Private Sub Unsubscribe()
     RemoveHandler MyHandler, AddressOf DoStuff
End Sub

如果我在开始后5秒钟之前关闭表格怎么办?当我尝试从未添加过的RemoveHandler时是否有问题?在c#中,+=-=是否相同?

2 个答案:

答案 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”。

因此,如果EventHandlerNothing,则事件尚未预订;如果事件不是Nothing,则您甚至可以检查事件的预订频率