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

.net 当我尝试删除从未添加的处理程序时会发生什么?,.net,.net,我有一个事件处理程序。 我在启动后5秒添加一个事件,如下所示: AddHandler MyHandler, AddressOf DoStuff 现在处理整个表单时,我需要 Private Sub Unsubscribe() RemoveHandler MyHandler, AddressOf DoStuff End Sub 如果我在启动后5秒之前关闭表单会怎么样?当我试图移除从未添加的处理程序时,是否有问题?c#与+=和-=中的情况相同吗?在一天结束时,它与s一起工作,并且Remo

我有一个事件处理程序。 我在启动后5秒添加一个事件,如下所示:

AddHandler MyHandler, AddressOf DoStuff
现在处理整个表单时,我需要

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

如果我在启动后5秒之前关闭表单会怎么样?当我试图
移除从未添加的
处理程序时,是否有问题?c#与
+=
-=
中的情况相同吗?

在一天结束时,它与s一起工作,并且
RemoveHandler
(VB)或
-=
(c#)的操作是调用,它返回:

如果在该实例的调用列表中找到
value
,则在其调用列表中没有
value
的新委托;否则,将使用其原始调用列表创建此实例

所以很好


(这会忽略,但这些的任何实现都应尝试遵循相同的模式)

在一天结束时,这将与s一起工作,并且
RemoveHandler
(VB)或
-=
(C#)的操作将调用,其返回:

如果在该实例的调用列表中找到
value
,则在其调用列表中没有
value
的新委托;否则,将使用其原始调用列表创建此实例

所以很好


(这忽略了,但是这些的任何实现都应该尝试遵循相同的模式)

在我看来,调用
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”(我的事件称为“Test”,因此
EventHandler
称为“TestEvent”)


因此,如果
EventHandler
Nothing
,则事件尚未订阅,如果它不是
Nothing
,您甚至可以检查订阅的频率。

在我看来,调用
removehdler
,无论之前调用了
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”(我的事件称为“Test”,因此
EventHandler
称为“TestEvent”)


因此,如果
EventHandler
Nothing
,则事件尚未订阅,如果它不是
Nothing
,您甚至可以检查订阅的频率。

您尝试过吗?发生了什么事?什么都没发生,但我的同事告诉我这是错的。他有没有详细说明为什么是错的?为这种说法要求证据并不粗鲁。他们有没有告诉你该怎么做,为什么?不要让别人在没有解释的情况下告诉你一些错误。@Fildor是的,但我无法理解,希望在这里找到更好的解释。你试过了吗?发生了什么事?什么都没发生,但我的同事告诉我这是错的。他有没有详细说明为什么是错的?为这种说法要求证据并不粗鲁。他们有没有告诉你该怎么做,为什么?不要让别人在没有解释的情况下告诉你有什么不对。@Fildor是的,但我无法理解,希望在这里找到更好的解释。