Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 před-události by bylo Form.Closing, která je vyvolána před uzavřením formuláře. Příkladem post-event by byl Form.Closed, který je vyvolán po uzavření formuláře.
✔️ Používejte termín "raise" pro události namísto "aktivovat" nebo "spouštět".
✔️ 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 EventArgs používáte přímo při odesílání API, nikdy nebudete moct přidávat žádná data k události bez 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 může 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 ve svém přepsání metody nevyužije základní implementaci. Připravte se na to tak, že nezařazujte žádné procesy do metody, která je potřebná pro správné fungování základní třídy.
✔️ Vezmě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. Toto platí pouze pro předudálosti.
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 používat návratový typ void pro obslužné rutiny událostí.
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 pojmenujte ho sender.
✔️ Použijte System.EventArgs nebo jeho podtřídu jako typ druhého parametru obslužné rutiny události a nazvěte ho e.
❌ U obslužných rutin událostí nemějte více než dva parametry.
Části z © 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.
Přetištěno se svolením Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition od Krzysztofa Cwaliny a Brada Abramse, vydáno 22. října 2008 nakladatelstvím Addison-Wesley Professional jako součást série Microsoft Windows Development.