2013-03-11 39 views
5

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

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

Private WithEvents _MyButton 

现在我订阅的事件处理程序:

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

请问DoClick()功能被称为静止当我改变的情况下按钮对象如下所示?

_MyButton = New Button() 
+0

我想:是的,但不知道... – serhio 2013-03-11 10:16:05

+2

是的,它会的。设置参考时,处理程序会根据需要自动添加和/或删除。 – 2013-03-11 12:12:09

回答

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 

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

相关问题