2013-03-11 19 views
5

WithEvents in Visual Basic mantiene il valore EventHandler s quando si modifica il riferimento all'oggetto?Does WithEvents in Visual Basic mantiene i suoi EventHandler quando cambia il riferimento all'oggetto?

Dire ho dichiarato un pulsante, gli eventi di cottura:

Private WithEvents _MyButton 

Ora sono la sottoscrizione di un gestore di eventi:

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

Intende la funzione di DoClick() essere ancora chiamato quando cambio l'istanza di l'oggetto pulsante come mostrato di seguito?

_MyButton = New Button() 
+0

suppongo: Sì, ma non è sicuro ... – serhio

+2

Sì, lo farà. Quando il riferimento è impostato, i gestori vengono automaticamente aggiunti e/o rimossi secondo necessità. –

risposta

3

Questo mi ha fatto curioso così ho scritto una piccola applicazione console di visualizzare ciò che accade se fate questo esperimento utilizzando un timer:

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 

Se si esegue questo codice, troverete che lo fa in effetti collegare il gestore di eventi quando l'istanza di _t viene sostituita. Non so come si fa, ma probabilmente la magia si trova nella parola chiave Handles. Comunque, la risposta è sì.