2013-03-11 34 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關鍵字。無論如何,答案是肯定的。

相關問題