Úvod do událostí
Události jsou, jako jsou delegáti, mechanismus pozdní vazby . Události jsou ve skutečnosti založeny na jazykové podpoře delegátů.
Události představují způsob, jak objekt vysílat (všem zúčastněným komponentám v systému), ke kterým došlo. Každá jiná komponenta se může přihlásit k odběru události a být upozorněna při vyvolání události.
Pravděpodobně jste použili události v některém z vašich programů. Mnoho grafických systémů má model událostí pro hlášení interakce uživatelů. Tyto události by hlásily pohyb myši, stisknutí tlačítek a podobné interakce. To je jeden z nejběžnějších, ale určitě ne jediný scénář, ve kterém se používají události.
Můžete definovat události, které by měly být vyvolány pro vaše třídy. Jednou z důležitých aspektů při práci s událostmi je, že pro konkrétní událost nemusí být zaregistrovaný žádný objekt. Kód musíte napsat tak, aby nevyvolá události, když nejsou nakonfigurované žádné naslouchací procesy.
Přihlášení k odběru události také vytvoří spojení mezi dvěma objekty (zdrojem události a jímkou události). Potřebujete zajistit, aby se jímka událostí odhlásila ze zdroje událostí, pokud už události nemají zájem.
Návrh jazyka pro události cílí na tyto cíle:
Povolte velmi minimální párování mezi zdrojem událostí a jímkou událostí. Tyto dvě komponenty nemusí napsat stejná organizace a dokonce se můžou aktualizovat úplně různými plány.
Přihlášení k odběru události by mělo být velmi jednoduché a odhlásit odběr stejné události.
Zdroje událostí by měly podporovat více odběratelů událostí. Měla by také podporovat, aby nepřišli žádní odběratelé událostí.
Vidíte, že cíle pro události jsou velmi podobné cílům delegátů. Proto je podpora jazyka událostí založená na podpoře jazyka delegáta.
Syntaxe pro definování událostí a přihlášení k odběru nebo zrušení odběru událostí je rozšíření syntaxe pro delegáty.
K definování události, kterou použijete event
klíčové slovo:
public event EventHandler<FileListArgs> Progress;
Typ události (EventHandler<FileListArgs>
v tomto příkladu) musí být typ delegáta. Při deklarování události byste měli dodržovat řadu konvencí. Typ delegáta události má obvykle návrat void.
Deklarace událostí by měly být sloveso nebo slovesné spojení.
Použijte minulé časy, když událost hlásí něco, co se stalo. Pokud chcete nahlásit něco, co se chystá, použijte prezentující častá sloveso (například Closing
). Použití současného času často značí, že vaše třída podporuje nějaký druh chování přizpůsobení. Jedním z nejběžnějších scénářů je podpora zrušení. Událost může například obsahovat argument, který by indikoval, Closing
jestli má operace uzavření pokračovat nebo ne. Jiné scénáře mohou volajícím umožnit změnit chování aktualizací vlastností argumentů události. Můžete vyvolat událost s uvedením navrhované další akce, kterou algoritmus provede. Obslužná rutina události může řadit jinou akci úpravou vlastností argumentu události.
Když chcete vyvolat událost, volejte obslužné rutiny událostí pomocí syntaxe vyvolání delegáta:
Progress?.Invoke(this, new FileListArgs(file));
Jak je popsáno v části o delegátech, ?. operátor usnadňuje zajištění, že se nepokoušíte vyvolat událost, pokud k této události nejsou žádní odběratelé.
K odběru události se přihlašujete pomocí operátoru +=
:
EventHandler<FileListArgs> onProgress = (sender, eventArgs) =>
Console.WriteLine(eventArgs.FoundFile);
fileLister.Progress += onProgress;
Metoda obslužné rutiny má obvykle předponu On následovanou názvem události, jak je znázorněno výše.
Odhlásíte odběr pomocí operátoru -=
:
fileLister.Progress -= onProgress;
Je důležité deklarovat místní proměnnou pro výraz, který představuje obslužnou rutinu události. Tím se zajistí, že odběr odběru odebere obslužnou rutinu. Pokud jste místo toho použili tělo výrazu lambda, pokoušíte se odebrat obslužnou rutinu, která nebyla nikdy připojena, což nic nedělá.
V dalším článku se dozvíte více o typických vzorech událostí a různých variantách v tomto příkladu.
Zpětná vazba k produktu .NET
.NET je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby: