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