Visual Basic中的WithEvents在更改对象的引用时是否保留其EventHandler?

ser*_*hio 5 .net vb.net events handles event-handling

WithEventsEventHandler更改对象的引用时,Visual Basic中是否保留了它?

说我已经宣布一个按钮,发射事件:

Private WithEvents _MyButton
Run Code Online (Sandbox Code Playgroud)

现在我订阅了一个事件处理程序:

Private Sub _MyButton_Click() Handles _MyButton.Click 
  ' Here I DoClick()
End Sub
Run Code Online (Sandbox Code Playgroud)

DoClick()当我更改按钮对象的实例时,是否仍会调用该函数,如下所示?

_MyButton = New Button()
Run Code Online (Sandbox Code Playgroud)

Ste*_*ens 3

这让我很好奇,所以我编写了一个小型控制台应用程序来可视化如果使用计时器进行此实验会发生什么:

Private WithEvents _t As New Timers.Timer With {.Enabled = True}
Private Sub _t_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles _t.Elapsed
    Console.WriteLine("tick")
End Sub

Sub Main()
    ' let it tick for 5 seconds
    Task.Delay(5000).Wait()

    ' destroy the current timer
    Console.WriteLine("destroying this timer")
    _t.Dispose()
    _t = Nothing

    ' add a little pause
    Task.Delay(1000).Wait()

    ' create a new timer
    Console.WriteLine("creating a new timer")
    _t = New Timers.Timer With {.Enabled = True}

    ' let it tick for 5 seconds
    Task.Delay(5000).Wait()

End Sub
Run Code Online (Sandbox Code Playgroud)

_t如果您运行此代码,您会发现它确实在替换 的实例时附加了事件处理程序。我不知道它是如何做到这一点的,但神奇之处可能在于关键字Handles。无论如何,答案是肯定的。