1 / 15

Delegáty ( 1 )

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:

jonco
Download Presentation

Delegáty ( 1 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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. 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. 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. 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. 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. 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

  7. 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. 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. 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); }}

  10. 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. 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. 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. 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. 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. 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é

More Related