programowanieProgramista VB.NET

Opisz mechanikę zdarzeń (Events) w Visual Basic i podaj przykład stworzenia własnego zdarzenia. Na co należy zwrócić uwagę przy deklaracji i subskrypcji?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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:

  • Zdarzenie można wywołać tylko w tej samej klasie, w której zostało zadeklarowane
  • Jeśli zdarzenie ma argumenty, ich typy muszą być ściśle określone
  • WithEvents można używać tylko z polami i właściwościami klasy
  • Subskrybując zdarzenie, pamiętaj, aby odsubskrybować w razie potrzeby (np. aby uniknąć wycieków pamięci)

Pytanie z podchwytliwością

Czy można zadeklarować zdarzenie z modyfikatorem dostępu Private i 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ć.

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


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 sender i e. 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.