当改变对对象的引用时,Visual Basic中的WithEvents是否保留它的EventHandlers ?



在Visual Basic中WithEvents在更改对对象的引用时保持其EventHandler s吗?

假设我已经声明了一个按钮,触发事件:

Private WithEvents _MyButton

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

Private Sub _MyButton_Click() Handles _MyButton.Click 
  ' Here I DoClick()
End Sub

当我像下面这样改变按钮对象的实例时,DoClick()函数还会被调用吗?

_MyButton = New Button()

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

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

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

相关内容

  • 没有找到相关文章

最新更新