150 likes | 279 Vues
Delegáty ( 1 ). Delegát ( delegate ) je datový typ, který definuje signaturu metody Delegáty bývají rovněž označovány jako typo-vě bezpečné ukazatele na funkce Deklarace delegáta definuje třídu, jež je odvo-zena z třídy System.Delegate Instance delegáta:
E N D
Delegáty (1) • Delegát (delegate) je datový typ, který definuje signaturu metody • Delegáty bývají rovněž označovány jako typo-vě bezpečné ukazatele na funkce • Deklarace delegáta definuje třídu, jež je odvo-zena z třídy System.Delegate • Instance delegáta: • slouží k reprezentaci odkazu (reference) na metodu (instanční i statickou) • může být asociována s libovolnou metodou, která má kompatibilní signaturu (stejný návratový typ a stejné parametry)
Delegáty (2) • Umožňují předávat metody jako parametry ji-ným metodám • Delegát se deklaruje s: • použitím klíčového slova delegate • popisem návratového typu • popisem parametrů • Příklad:public delegate int BinOpDel(int op1, int op2); • Před použitím delegáta je zapotřebí vytvořit jeho instanci, čímž dojde k asociování s kon-krétní metodou
Delegáty (3) • Poznámka: • jazyk C# také povoluje přiřadit do delegáta pouze název metody • Příklad:public static int Add(int op1, int op2) {return op1 + op2; }static void Main(){BinOpDel delVar = new BinOpDel(Add);// BinOpDel delVar = Add;int sum = delVar(1, 2); Console.WriteLine(sum);}
Delegáty (4) • Není-li delegátu přiřazena žádná hodnota (tzv. prázdný delegát), pak má hodnotu null • Vyvolání prázdného delegáta způsobí výjimku NullReferenceException • Při práci s delegáty je možné použít také tzv. anonymnímetody • Anonymní metody: • umožňují psát kód delegátů přímo „in-line“ • vytváří se klíčovým slovem delegate, za kterým následuje definice anonymní funkce
Delegáty (5) • Příklad:public delegate int BinOpDel(int op1, int op2);static void Main(){int sum; BinOpDel add = delegate(int op1, int op2){ return op1 + op2; }; sum = add(1, 2); Console.WriteLine(sum);}
Delegáty (6) • Knihovna dodávaná s .NET Frameworkem (BCL – Base ClassLibrary) poskytuje také ge-nerické delegáty: • Action: • delegát pro funkce bez návratové hodnoty • existuje 17 různých delegátů Action s různým počtem generických parametrů: Action,Action<T>, Action<T1,T2>, … • Func: • podobně jako Action existuje v 17 různých verzích, např. Func<T,TResult> • poslední generický parametr udává typ návratové hod-noty
Lambda výrazy (1) • Lambda výrazy jsou anonymní funkce, jež je možné přiřadit do delegáta (vznikly jako zjed-nodušení anonymních metod) • Umožňují psát lokální funkce, které mohou být předány jako parametry nebo vráceny jako hodnota volání funkce • Často používány při psaní LINQ výrazů • Zapisovány pomocí operátoru =>„přechází v“ • Lambda výraz specifikuje: • seznam vstupních parametrů (může být i prázdný) na levé straně operátoru => • výraz nebo příkazový blok na straně pravé
Lambda výrazy (2) • Příklad:(int a, int b) => { return a + b; } • Typy parametrů si dokáže překladač odvodit a mohou být vynechány • Jestliže má tělo výrazu na pravé straně jenom jednu operaci, pak lze vynechat složené závor-ky i klíčové slovo return:(a, b) => a + b; • Pokud levá strana obsahuje pouze jeden para-metr, je možné vynechat i kulaté závorky:n => n * n;
Lambda výrazy (3) • Příklad:classProgram{ public delegate intBinOpDel(int op1, int op2); static voidMain() { BinOpDel add = (op1, op2) => op1 + op2; intsum = add(1, 2);Console.WriteLine(sum); }}
Události (1) • Členy třídy umožňující objektu nebo třídě rea-govat na zprávy (události) • Dovolují třídě nebo objektu informovat jinou třídu nebo objekt, že nastala nějaká změna (událost) • Třída, která: • zasílá (vyvolává) událost se označuje jako publi-sher (vydavatel) • přijímá (obsluhuje) událost se nazývá subscriber (odběratel)
Události (2) • Pro události platí: • vydavatel udává, kdy událost nastane • odběratel stanovuje, jaká akce bude provedena jako odpověď na vzniklou událost (jako obsluha udá-losti) • událost může mít více odběratelů • odběratel může obsloužit více událostí od různých vydavatelů • Bývají nejčastěji využívány v souvislosti s GUI k oznámení, že došlo k nějaké uživatelské akci (např. stisknutí tlačítka myši, výběr položky z menu apod.)
Události (3) • Program (třída) může definovat metody, které mají za úkol zpracovat příchozí události • Metoda realizující zpracování (obsluhu) udá-losti se označuje jako tzv. event handler (ob-služná metoda) • Události jsou v jazyce C# implementovány pomocí delegátů • Parametry obslužné metody musí odpovídat definici delegáta, jež definuje její signaturu • Metod obsluhujících události může být více
Události (4) • Odkaz na obslužnou metodu se: • do události vkládá pomocí operátoru += • z události odebírá pomocí operátoru -= • Události se definují pomocí klíčového slova event, za nímž následuje typ delegáta asocio-vaného s touto událostí a název události • Příklad:public delegate void EventHandler(object sender,EventArgs e) public event EventHandler Click; • Třídy, které chtějí na vzniklou událost reago-vat, musí delegáta tohoto typu vytvořit a aso-ciovat k němu obslužnou metodu
Události (5) • Konvence: • delegát události by měl mít: • dva parametry: • objekt, který událost vyvolal • parametr typu třída EventArgs (nebo typu třída, která je ze třídy EventArgs odvozená), jež může specifikovat další infor-mace pro obslužnou metodu • návratový typ void • obvykle se používá delegát EventHandler • Před vyvoláním události by se vždy mělo ově-řit, zda člen události nenabývá hodnoty null tj. otestovat, zda událost má asociovánu obsluž-nou metodu
Události (6) • Poznámka: • ke každé události bývá zvykem vytvořit chráněnou virtuální metodu (OnNázevUdálosti), která danou událost vyvolá • příklad:protectedvirtualOnClick() {EventHandlerhandler = Click; if (handler!= null) handler(this,EventArgs.Empty); } • klíčové slovo protected označuje člena třídy, který je dostupný pouze v dané třídě a v třídách, které jsou z této třídy odvozené