2013-03-11 20 views
5

Czy WithEvents w języku Visual Basic zachowuje swoje EventHandler s podczas zmiany odniesienia do obiektu?Czy WithEvents w języku Visual Basic przechowują swoje EventHandlers podczas zmiany odniesienia do obiektu?

że mam ogłoszony przycisk, imprezy paleniska:

Private WithEvents _MyButton 

Teraz jestem zapisujący do obsługi zdarzeń:

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

Czy funkcja DoClick() być nadal nazywa kiedy zmienić instancję obiekt przycisku, jak pokazano poniżej?

_MyButton = New Button() 
+0

Przypuszczam: Tak, ale nie jestem pewien ... – serhio

+2

Tak, będzie. Po ustaleniu odniesienia procedury obsługi są automatycznie dodawane i/lub usuwane w razie potrzeby. –

Odpowiedz

3

To dało mi ciekawy więc napisałem małą aplikację konsoli do wizualizacji, co się dzieje, jeśli nie ten eksperyment przy użyciu 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 

Po uruchomieniu tego kodu, można zauważyć, że to robi w rzeczywistości dołącz obsługę zdarzenia, gdy instancja _t zostanie zastąpiona. Nie wiem, jak to działa, ale magia prawdopodobnie leży w słowie kluczowym Handles. Tak czy inaczej, odpowiedź brzmi: tak.