W Visual Basic .NET delegaty (Delegate) to obiekty, które enkapsulują odniesienie do metody, a zdarzenia (Events) to mechanizm powiadamiania subskrybentów o wystąpieniu określonych warunków lub zmian. Delegaty umożliwiają "przekazywanie" zachowania (metod) jako parametrów, a zdarzenia realizują wzorzec wydawca-subskrybent.
Cechy:
Event wewnątrz klasy.AddHandler, a wypisanie — przez RemoveHandler.Przykład:
' Definicja delegata Public Delegate Sub NotifyHandler(ByVal message As String) ' Klasa z wydarzeniem Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("Praca zakończona!") End Sub End Class ' Subskrypcja i wywołanie Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
Zdarzenia są szczególnie przydatne w programowaniu UI oraz w zarządzaniu logiką biznesową.
Co się stanie, jeśli wywołasz zdarzenie RaiseEvent, a nie ma na nie subskrybentów?
Nieprawidłowa odpowiedź: Pojawi się błąd w czasie wykonywania.
Prawidłowa odpowiedź: Nic się nie stanie — jeśli nie ma subskrybentów dla zdarzenia, wywołanie RaiseEvent jest bezpieczne, nie wystąpi wyjątek.
Przykład:
Public Event OnUpdate() ' Wywołanie RaiseEvent, nawet jeśli nikt nie jest subskrybentem: RaiseEvent OnUpdate() ' Dozwolone i nie prowadzi do błędu
Historia
W dużej aplikacji desktopowej deweloper nie wypisał obsługujących z zdarzeń, przez co obiekty nie były zwalniane przez zbieracza śmieci (memory leak). Prowadziło to do wzrostu pamięci i awarii po kilku godzinach pracy.
Historia
Młody specjalista, nie rozumiejąc działania delegatów i zdarzeń, przypadkowo podpisał jedną metodę kilka razy z rzędu. To prowadziło do wielokrotnego wywołania tych samych obsługujących — użytkownicy otrzymywali zduplikowane powiadomienia.
Historia
W jednym projekcie wywołano zdarzenieRaiseEvent, zakładając, że musi ono zadziałać. W testach odkryto, że bez subskrybentów nie ma żadnego efektu, co prowadziło do nieporozumień w logice biznesowej aplikacji i błędów w raportowaniu.