Návrh události
Poznámka:
Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.
Události jsou nejčastěji používanou formou zpětného volání (konstrukce, které umožňují rozhraní volat do uživatelského kódu). Mezi další mechanismy zpětného volání patří členové, kteří přebírají delegáty, virtuální členy a moduly plug-in založené na rozhraních. Data ze studií použitelnosti ukazují, že většina vývojářů je pohodlnější používat události, než používají jiné mechanismy zpětného volání. Události jsou pěkně integrované se sadou Visual Studio a mnoha jazyky.
Je důležité si uvědomit, že existují dvě skupiny událostí: události vyvolané před stavem systémových změn, označované jako události před událostmi a události vyvolané po změnách stavu, označované jako po událostech. Příkladem události před událostí by bylo Form.Closing
, který je vyvolán před uzavřením formuláře. Příkladem post-event by byl Form.Closed
, který je vyvolán po uzavření formuláře.
✔️ Nepoužívejte výraz "raise" pro události, nikoli "aktivovat" nebo "aktivační událost".
✔️ Místo ručního vytváření nových delegátů, které se mají použít jako obslužné rutiny událostí, použijte System.EventHandler<TEventArgs> .
✔️ Zvažte použití podtřídy EventArgs jako argumentu události, pokud si nejste naprosto jistí, že událost nebude nikdy muset přenést žádná data do metody zpracování událostí, v takovém případě můžete použít EventArgs
tento typ přímo.
Pokud odešlete rozhraní API přímo EventArgs
, nikdy nebudete moct přidávat žádná data, která se mají s událostí přenášet, aniž by došlo k narušení kompatibility. Pokud použijete podtřídu, i když je zpočátku zcela prázdná, budete moct v případě potřeby přidat do podtřídy vlastnosti.
✔️ K vyvolání každé události použijte chráněnou virtuální metodu. To platí pouze pro nestatické události u nezapečetěných tříd, ne na struktury, zapečetěné třídy nebo statické události.
Účelem metody je poskytnout způsob, jak odvozená třída zpracovat událost pomocí přepsání. Přepsání je flexibilnější, rychlejší a přirozenější způsob zpracování událostí základní třídy v odvozených třídách. Podle konvence by měl název metody začínat na "Zapnuto" a následovat s názvem události.
Odvozená třída se může rozhodnout, že nebude volat základní implementaci metody v jeho přepsání. Připravte se na to tak, že nezačte žádné zpracování v metodě, která je nutná pro správné fungování základní třídy.
✔️ Proveďte jeden parametr pro chráněnou metodu, která vyvolá událost.
Parametr by měl být pojmenovaný e
a měl by být zadán jako třída argumentu události.
❌ NEPŘEDÁVEJTE hodnotu null jako odesílatel při vyvolání nestatické události.
✔️ PŘI vyvolání statické události předejte hodnotu null jako odesílatele.
❌ PŘI vyvolání události nepředávejte hodnotu null jako parametr dat události.
Pokud nechcete předávat žádná data do metody zpracování událostí, měli byste předat EventArgs.Empty
. Vývojáři očekávají, že tento parametr nebude mít hodnotu null.
✔️ ZVAŽTE vyvolání událostí, které může koncový uživatel zrušit. To platí jenom pro události před událostmi.
Jako argument události použijte System.ComponentModel.CancelEventArgs nebo jeho podtřídu, aby koncový uživatel mohl události zrušit.
Návrh vlastní obslužné rutiny události
Existují případy, kdy EventHandler<T>
nelze použít, například když architektura potřebuje pracovat s dřívějšími verzemi CLR, které nepodporují obecné typy. V takových případech může být potřeba navrhnout a vytvořit vlastní delegát obslužné rutiny události.
✔️ Do use a return type of void for event handlers.
Obslužná rutina události může vyvolat více metod zpracování událostí, pravděpodobně u více objektů. Pokud by metody zpracování událostí měly povoleno vracet hodnotu, pro každé vyvolání události by bylo více vrácených hodnot.
✔️ POUŽIJTE object
jako typ prvního parametru obslužné rutiny události a zavolejte ho sender
.
✔️ Do use System.EventArgs or its subclass as the type of the second parameter of the event handler, and call it e
.
❌ U obslužných rutin událostí nemáte více než dva parametry.
© Části 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.
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 v rámci Microsoft Windows Development Series.