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.
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 jsou způsob, jakým objekt může vysílat (všem zúčastněným komponentám v systému), že se něco stalo. 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 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 zpracovatel událostí odhlásil ze zdroje událostí, když již nemáte zájem o události.
Cíle návrhu pro podporu událostí
Návrh jazyka pro události cílí na tyto cíle:
- Povolte minimální párování mezi zdrojem událostí a přjímačem událostí. Tyto dvě komponenty mohou vytvořit různé organizace a mohou se dokonce aktualizovat podle různých harmonogramů.
- Přihlášení k odběru události by mělo být jednoduché a odhlásit odběr stejné události.
- Zdroje událostí by měly podporovat více odběratelů událostí. Také by měla podporovat stav, kdy nejsou připojeni žádní odběratelé událostí.
Vidíte, že cíle pro události jsou podobné cílům delegátů. Proto je podpora jazyka událostí založená na podpoře jazyka delegáta.
Podpora jazyka pro události
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 použijete klíčové slovo event:
public event EventHandler<FileFoundArgs>? FileFound;
Typ události (EventHandler<FileListArgs> v tomto příkladu) musí být typem delegáta. Při deklarování události byste měli postupovat podle 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. Pomocí slovesa v přítomném čase (například Closing) oznamte něco, co se chystá stát. 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í. Například událost Closing může obsahovat argument, který by indikoval, jestli má operace uzavření pokračovat nebo ne. Další scénáře umožňují volajícím změnit chování aktualizací vlastností argumentů události. Můžete vyvolat událost, která označuje navrženou další akci, kterou algoritmus provede. Obslužná rutina události může vyžadovat jinou akci úpravou vlastností argumentu události.
Když chcete vyvolat událost, volejte obslužné rutiny událostí pomocí syntaxe vyvolání delegáta:
FileFound?.Invoke(this, new FileFoundArgs(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 +=:
var fileLister = new FileSearcher();
int filesFound = 0;
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.FoundFile);
filesFound++;
};
fileLister.FileFound += onFileFound;
Metoda obslužné rutiny má obvykle předponu On následovanou názvem události, jak je znázorněno v předchozím kódu.
Odhlásíte odběr pomocí operátoru -=:
fileLister.FileFound -= onFileFound;
Je důležité deklarovat místní proměnnou pro výraz, který představuje obslužný program události. Tím se zajistí, že odhlášení 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.