Rozlišování delegátů a událostí
Vývojáři, kteří s platformou .NET Core často pracují při rozhodování mezi návrhem založeným na delegates
návrhu a návrhem založeným na events
nich . Volba delegátů nebo událostí je často obtížná, protože tyto dvě jazykové funkce jsou podobné. Události jsou dokonce sestaveny pomocí jazykové podpory pro delegáty.
Oba nabízejí scénář pozdní vazby: umožňují scénáře, kdy komponenta komunikuje voláním metody, která je známa pouze za běhu. Podporují metody jednoho i více odběratelů. Možná najdete podporu jednosměrového vysílání a vícesměrového vysílání. Obě podporují podobnou syntaxi pro přidávání a odebírání obslužných rutin. Nakonec vyvolání události a volání delegáta použije přesně stejnou syntaxi volání metody. I obě podporují stejnou Invoke()
syntaxi metody pro použití s operátorem ?.
.
Se všemi těmito podobnostmi je snadné určit, kdy se má použít.
Naslouchání událostem je volitelné.
Nejdůležitějším aspektem při určování, kterou jazykovou funkci použít, je to, jestli musí být připojený odběratel nebo ne. Pokud váš kód musí volat kód zadaný odběratelem, měli byste použít návrh založený na delegátech, když potřebujete implementovat zpětné volání. Pokud váš kód dokáže dokončit veškerou svou práci bez volání předplatitelů, měli byste použít návrh založený na událostech.
Podívejte se na příklady vytvořené v této části. Kód, který jste vytvořili pomocí List.Sort()
, musí mít funkci porovnávače, aby bylo možné prvky správně seřadit. Dotazy LINQ musí být dodány s delegáty, aby bylo možné určit, které prvky se mají vrátit. Oba používali návrh vytvořený s delegáty.
Progress
Zvažte událost. Zaznamenává průběh úkolu.
Úkol pokračuje bez ohledu na to, jestli existují nějaké naslouchací procesy.
Dalším FileSearcher
příkladem je. Stále by vyhledal a našel všechny soubory, které byly požadovány, a to i bez připojených odběratelů událostí.
Ovládací prvky uživatelského rozhraní stále fungují správně, i když žádné odběratele nenaslouchají událostem. Oba používají návrhy založené na událostech.
Návratové hodnoty vyžadují delegáty.
Dalším aspektem je prototyp metody, který byste chtěli pro metodu delegáta. Jak jste viděli, delegáti, kteří se používají pro události, mají návratový typ void. Viděli jste také, že existují idiomy k vytvoření obslužných rutin událostí, které předávají informace zpět do zdrojů událostí prostřednictvím úprav vlastností objektu argumentu události. I když tyto idiomy fungují, nejsou tak přirozené jako vrácení hodnoty z metody.
Všimněte si, že tyto dvě heuristiky mohou být často přítomny: Pokud vaše metoda delegáta vrátí hodnotu, pravděpodobně ovlivní algoritmus nějakým způsobem.
Události mají privátní vyvolání
Třídy jiné než třídy, ve kterých je událost obsažena, může přidávat a odebírat pouze naslouchací procesy událostí; Událost může vyvolat pouze třída obsahující událost. Události jsou obvykle členy veřejné třídy. Ve srovnání se delegáti často předávají jako parametry a ukládají se jako členové privátní třídy, pokud jsou vůbec uloženy.
Naslouchací procesy událostí mají často delší životnost
To, že naslouchací procesy událostí mají delší životnost, je mírně slabší odůvodnění. Můžete ale zjistit, že návrhy založené na událostech jsou přirozenější, když zdroj událostí bude vyvolávat události po dlouhou dobu. Příklady návrhu založeného na událostech pro ovládací prvky uživatelského rozhraní můžete zobrazit v mnoha systémech. Jakmile se přihlásíte k odběru události, zdroj událostí může vyvolat události po celou dobu životnosti programu. (Pokud je už nepotřebujete, můžete se odhlásit z událostí.)
Naproti tomu s mnoha návrhy založenými na delegátech, kde se delegát používá jako argument metody, a delegát se po návratu této metody nepoužije.
Pečlivě vyhodnotit
Výše uvedené aspekty nejsou tvrdá a rychlá pravidla. Místo toho představují pokyny, které vám můžou pomoct rozhodnout, která volba je pro vaše konkrétní použití nejvhodnější. Vzhledem k tomu, že jsou podobné, můžete dokonce prototypovat obojí a zvážit, se kterým by bylo přirozenější pracovat. Oba zvládnou dobře scénáře s pozdní vazbou. Použijte ten, který komunikuje s vaším návrhem, co je nejlepší.