Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilRozálie Musilová
1
08/04/20151 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)
2
08/04/20152 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
3
08/04/20153 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); }
4
08/04/20154 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
5
08/04/20155 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); }
6
08/04/20156 Delegáty (6) Knihovna dodávaná s.NET Frameworkem (BCL – Base Class Library) 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, Action, … –Func : podobně jako Action existuje v 17 různých verzích, např. Func poslední generický parametr udává typ návratové hod- noty
7
08/04/20157 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é
8
08/04/20158 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;
9
08/04/20159 Lambda výrazy (3) Příklad: class Program { public delegate int BinOpDel(int op1, int op2); static void Main() { BinOpDel add = (op1, op2) => op1 + op2; int sum = add(1, 2); Console.WriteLine(sum); } }
10
08/04/201510 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)
11
08/04/201511 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.)
12
08/04/201512 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
13
08/04/201513 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
14
08/04/201514 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
15
08/04/201515 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: protected virtual OnClick() { EventHandler handler = 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é
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.