W Visual Basic zdarzenia (Events) pozwalają obiektowi informować inne komponenty aplikacji o zaistniałych zmianach. Zdarzenie jest deklarowane za pomocą słowa kluczowego Event. Wywołuje się je za pomocą metody RaiseEvent (VB.NET) lub Raise (VB6), a komponenty mogą się na nie subskrybować (Handles/WithEvents).
Przykład VB.NET:
Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...jakieś prace RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("Praca zakończona!") End Sub End Class
Ważne punkty:
WithEvents można używać tylko z polami i właściwościami klasyCzy można zadeklarować zdarzenie z modyfikatorem dostępu
Privatei subskrybować je z innej klasy?
Odpowiedź: Nie, modyfikator Private ogranicza widoczność zdarzenia tylko do tej klasy, w której zostało zadeklarowane. Inne klasy go nie zobaczą, co oznacza, że nie będą mogły się subskrybować.
Historia
W dużej aplikacji zdarzenia tworzono z modyfikatorem
Public, ale nigdzie nie odsubskrybowano ich wyraźnie. Przy długotrwałej pracy aplikacji prowadziło to do wycieków pamięci, ponieważ obsługujący referencje utrzymywali niepotrzebne obiekty.
Historia
Podczas migracji z VB6 do VB.NET programista oczekiwał, że zdarzenie będzie dostępne we wszystkich modułach, ale domyślnie zdarzenie było
Friend. W rezultacie obsługa nie działała, a ten błąd znaleziono dopiero podczas testów integracyjnych.
Historia
Programista pomylił się w sygnaturze delegata zdarzenia — zamienił miejscami
senderie. Nie było żadnej wiadomości o błędzie (obsługa zdarzeń po prostu nie była wywoływana), a potrzebna logika biznesowa była ukrywana do półfinałowego wydania.