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



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

AddHandler MyHandler, AddressOf DoStuff

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

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

如果我在开始后 5 秒内关闭表单怎么办?当我尝试RemoveHandler从未添加的内容时,这是一个问题吗?在 c# 中与+=-=相同吗?

在一天结束时,这最终会使用MulticastDelegates,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"(。

因此,如果EventHandlerNothing,该事件尚未订阅,如果尚未订阅,如果您尚未Nothing,您甚至可以检查订阅频率。

相关内容

最新更新