2013-03-11 20 views
5

WithEvents trong Visual Basic giữ EventHandler s khi thay đổi tham chiếu đến đối tượng không?Does WithEvents trong Visual Basic giữ EventHandlers của nó khi thay đổi tham chiếu đến đối tượng?

Nói rằng tôi đã tuyên bố một nút, bắn các sự kiện:

Private WithEvents _MyButton 

Bây giờ tôi đang đăng ký vào một event handler:

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

sẽ chức năng DoClick() được vẫn gọi khi tôi thay đổi thể hiện của đối tượng nút như hình dưới đây?

_MyButton = New Button() 
+0

Tôi giả sử: Có, nhưng không chắc chắn ... – serhio

+2

Có, nó sẽ. Khi tham chiếu được thiết lập, các trình xử lý sẽ tự động được thêm vào và/hoặc bị xóa khi cần thiết. –

Trả lời

3

này đã cho tôi tò mò nên tôi đã viết một ứng dụng giao diện điều khiển nhỏ để hình dung những gì sẽ xảy ra nếu bạn làm thí nghiệm này sử dụng một bộ đếm thời gian:

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 

Nếu bạn chạy mã này, bạn sẽ thấy rằng nó thực sự gắn trình xử lý sự kiện khi cá thể của _t được thay thế. Tôi không biết nó như thế nào, nhưng ma thuật có lẽ nằm trong từ khóa Handles. Nhưng dù sao, câu trả lời là có.

Các vấn đề liên quan