Projekt zdarzenia

Uwaga

Ta zawartość jest drukowana przez uprawnienie Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.

Zdarzenia to najczęściej używana forma wywołań zwrotnych (konstrukcje, które umożliwiają platformie wywoływanie kodu użytkownika). Inne mechanizmy wywołania zwrotnego obejmują elementy członkowskie biorące delegatów, wirtualne elementy członkowskie i wtyczki oparte na interfejsie. Dane z badań użyteczności wskazują, że większość deweloperów korzysta z zdarzeń bardziej komfortowo niż korzystają z innych mechanizmów wywołania zwrotnego. Zdarzenia są ładnie zintegrowane z programem Visual Studio i wieloma językami.

Należy pamiętać, że istnieją dwie grupy zdarzeń: zdarzenia zgłaszane przed stanem zmian systemowych, nazywane zdarzeniami wstępnymi i zdarzeniami zgłoszonymi po zmianie stanu, nazywanymi zdarzeniami po zdarzeń. Przykładem zdarzenia przed Form.Closingzdarzeniem będzie wartość , która jest wywoływana przed zamknięciem formularza. Przykładem zdarzenia po zdarzeniu Form.Closedbędzie wartość , która jest wywoływana po zamknięciu formularza.

✔️ Należy użyć terminu "raise" dla zdarzeń, a nie "fire" lub "trigger".

✔️ Należy użyć System.EventHandler<TEventArgs> zamiast ręcznie tworzyć nowych delegatów, które mają być używane jako programy obsługi zdarzeń.

✔️ ROZWAŻ użycie podklasy EventArgs jako argumentu zdarzenia, chyba że jest absolutnie pewne, że zdarzenie nigdy nie będzie musiało przenosić żadnych danych do metody obsługi zdarzeń, w tym przypadku można użyć EventArgs typu bezpośrednio.

Jeśli wysyłasz interfejs API bezpośrednio EventArgs , nigdy nie będziesz w stanie dodać żadnych danych, które mają być przenoszone ze zdarzeniem bez niezgodności. Jeśli używasz podklasy, nawet jeśli początkowo jest całkowicie pusta, w razie potrzeby będzie można dodać właściwości do podklasy.

✔️ Aby zgłosić każde zdarzenie, należy użyć chronionej metody wirtualnej. Ma to zastosowanie tylko do zdarzeń niestatycznych w niezaznaczonej klasie, a nie do struktur, zapieczętowanych klas lub zdarzeń statycznych.

Celem metody jest zapewnienie sposobu obsługi zdarzenia przez klasę pochodną przy użyciu przesłonięcia. Zastępowanie jest bardziej elastycznym, szybszym i bardziej naturalnym sposobem obsługi zdarzeń klasy bazowej w klasach pochodnych. Zgodnie z konwencją nazwa metody powinna zaczynać się od "Wł." i być zgodna z nazwą zdarzenia.

Klasa pochodna może nie wywoływać podstawowej implementacji metody w jej przesłonięć. Przygotuj się na to, nie uwzględniając żadnego przetwarzania w metodzie wymaganej do poprawnego działania klasy bazowej.

✔️ Należy podjąć jeden parametr do chronionej metody, która zgłasza zdarzenie.

Parametr powinien mieć nazwę e i powinien być wpisany jako klasa argumentu zdarzenia.

❌ Nie przekazuj wartości null jako nadawcy w przypadku zgłaszania zdarzenia niestatycznego.

✔️ Czy przekazać wartość null jako nadawcę podczas zgłaszania zdarzenia statycznego.

❌ NIE przekazuj wartości null jako parametru danych zdarzenia podczas zgłaszania zdarzenia.

Należy przekazać dane EventArgs.Empty , jeśli nie chcesz przekazywać żadnych danych do metody obsługi zdarzeń. Deweloperzy oczekują, że ten parametr nie będzie mieć wartości null.

✔️ ROZWAŻ podniesienie zdarzeń, które użytkownik końcowy może anulować. Dotyczy to tylko zdarzeń wstępnych.

Użyj System.ComponentModel.CancelEventArgs klasy lub jej podklasy jako argumentu zdarzenia, aby umożliwić użytkownikowi końcowemu anulowanie zdarzeń.

Niestandardowy projekt programu obsługi zdarzeń

Istnieją przypadki, w których EventHandler<T> nie można używać, na przykład wtedy, gdy platforma musi pracować z wcześniejszymi wersjami środowiska CLR, które nie obsługują typów ogólnych. W takich przypadkach może być konieczne zaprojektowanie i opracowanie niestandardowego delegata obsługi zdarzeń.

✔️ Należy użyć zwracanego typu void dla procedur obsługi zdarzeń.

Procedura obsługi zdarzeń może wywoływać wiele metod obsługi zdarzeń, na przykład na wielu obiektach. Gdyby metody obsługi zdarzeń mogły zwrócić wartość, dla każdego wywołania zdarzenia będzie można zwrócić wiele wartości zwracanych.

✔️ Należy użyć object jako typu pierwszego parametru programu obsługi zdarzeń i wywołać go sender.

✔️ Należy użyć System.EventArgs lub jego podklasy jako typu drugiego parametru programu obsługi zdarzeń i wywołać go e.

❌ Nie należy mieć więcej niż dwóch parametrów w programach obsługi zdarzeń.

© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional w ramach Microsoft Windows Development Series.

Zobacz też