programowanieProgramista VB.NET

Opisz działanie i cechy obsługi zdarzeń (Events) oraz delegatów (Delegates) w Visual Basic .NET. Jakie problemy mogą wystąpić przy ich niewłaściwym użyciu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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:

  • Zdarzenia są deklarowane przy użyciu słowa kluczowego Event wewnątrz klasy.
  • Delegaty definiują sygnaturę metod, które można subskrybować do zdarzenia.
  • Subskrypcja odbywa się przez 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ą.

Pytanie z podstępem

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

Przykłady rzeczywistych błędów z powodu nieznajomości szczegółów tematu


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 zdarzenie RaiseEvent, 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.