2013-03-11 1 views
5

WithEvents в Visual Basic сохранить его EventHandler с при изменении ссылки на объект?Does WithEvents в Visual Basic сохраняют свои EventHandlers при изменении ссылки на объект?

Say I объявили кнопку, стреляющие события:

Private WithEvents _MyButton 

Теперь я подписавшись на обработчик события:

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

Будет ли функция DoClick() быть еще называют, когда я изменить экземпляр объект кнопки, как показано ниже?

_MyButton = New Button() 
+0

Я полагаю: Да, но не уверен ... – serhio

+2

Да, это будет. Когда ссылка задана, обработчики автоматически добавляются и/или удаляются по мере необходимости. –

ответ

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. Во всяком случае, ответ - да.