Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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.

Podobné prezentace


Prezentace na téma: "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."— Transkript prezentace:

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) 06/05/2018

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 06/05/2018

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); } 06/05/2018

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 06/05/2018

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); } 06/05/2018

6 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<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 06/05/2018

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í výrazů LINQ 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é 06/05/2018

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; 06/05/2018

9 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); } } 06/05/2018

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) 06/05/2018

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.) 06/05/2018

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 06/05/2018

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 06/05/2018

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 06/05/2018

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: protected virtual void 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é 06/05/2018

16 LINQ (1) LINQ (Language Integrated Query) je součást MS .NET Frameworku umožňující jednotný přístup k datům a jejich zpracování deklarativ-ním a funkcionálním způsobem Představuje dotazovací jazyk (podobný SQL), který je integrovaný přímo do syntaxe jazyka C# Poskytuje syntaktickou kontrolu dotazů v době překladu programu Mezi výhody technologie LINQ patří zejména: zjednodušení a zpřehlednění programového kódu jednotná forma práce s různě reprezentovanými daty 06/05/2018

17 LINQ (2) LINQ: Zpracovávaná data mohou být uložena např. v:
přináší nový způsob pro dotazování nad různě repre-zentovanými daty usnadňuje: jejich třídění jejich propojování vyhledávání v nich Zpracovávaná data mohou být uložena např. v: polích kolekcích odvozených od generického rozhraní IEnumerable<T> XML SQL databázích 06/05/2018

18 LINQ (3) Zpřehlednění práce s daty pomocí LINQ je v ja-zyku C# dosaženo prostřednictvím: implicitně typovaných proměnných (var) rozšiřujících metod: metody rozšiřující již existující datové typy (třídy nebo struktury) dodatečnými statickými metodami lambda výrazů: jednodušší forma zápisu anonymních metod inicializátorů objektů: umožňují v době vytváření objektů nastavit jejich vlast-nosti a datové položky (bez nutnosti použití specifického konstruktoru) příklad: Dog dog = new Dog { Name = ”Rex”, Age = 5 }; 06/05/2018

19 LINQ (4) inicializátorů kolekcí:
dovolují v době volání konstruktoru kolekce uvést seznam objektů kolekce musí implementovat rozhraní IEnumerable a obsahovat metodu Add pro vložení položky příklady: List<int> nums = new List<int> { 1, 2, 3, 4, 5 }; List<Dog> dogs = new List<Dog> { new Dog { Name = ”Rex”, Age = 5 }, new Dog { Name = ”Don”, Age = 2 }, new Dog { Name = ”Caesar”, Age = 7 } }; 06/05/2018

20 LINQ (5) anonymních typů: slouží k zapouzdření proměnných bez nutnosti deklarovat datový typ obsahují jednu nebo více vlastností, které se nastaví při vytvoření instance a dále slouží jen ke čtení lze je deklarovat jen pomocí implicitně typované proměn-né (var) vlastnosti se určí z objektové inicializace příklad: var Rex = new { Name = "Rex", Age = 5 }; Překlad z dotazu LINQ na dotaz pro konkrétní platformu je realizovaný pomocí tzv. LINQ (po-skytovatelů) providers 06/05/2018

21 LINQ (6) Mezi nejčastěji používané poskytovatele techno-logie LINQ patří: LINQ to Objects: slouží k práci s libovolnou kolekcí (polem), která imple-mentuje rozhraní IEnumerable<T> LINQ to SQL: mapuje příkazy LINQ na dotazy SQL a umožňuje práci s MS SQL Server a MS SQL Express LINQ to DataSet: používá technologii ADO.NET pro komunikaci s databá-zemi LINQ to XML: umožňuje práci se (dotazy nad) soubory XML 06/05/2018

22 LINQ to Objects (1) Definován ve jmenném prostoru System.Linq
Slouží k dotazování nad daty, která jsou v ope-rační paměti (poli, třídami implementujícími rozhraní IEnumerable<T>) Dotazovací engine je spuštěn spolu s programem a umožňuje lokální dotazování Odpadává nutnost vytváření vlastních algoritmů pro vyhledávání v kolekcích Dotazování není dynamické: jakmile se jeden dotaz vyhodnotí a vrátí výslednou množinu, tak se do něj již nepromítají změny v pů-vodních datech 06/05/2018

23 LINQ to Objects (2) Pro zápis dotazů LINQ je možné použít např. následující operátory (klíčová slova): from: první klíčové slovo dotazu slouží ke specifikaci datového zdroje, nad kterým je prováděn dotaz where (Where): umožňuje definovat podmínku (restrikci) pro výsledek jestliže podmínka vrátí hodnotu true, tak je prvek zahrnut do výsledku select (Select): produkuje výsledky dotazu používá se k implementaci projekce, kde jsou pouze něk-teré datové složky objektu použity ve výsledku uvádí se vždy na konci dotazu 06/05/2018

24 LINQ to Objects (3) group (GroupBy): into:
umožňuje seskupování prvků ve výsledku podle určitého klíče k použití tohoto slova se váže také použití klíčového slo-va by into: používáno v kombinaci s klíčovým slovem group, join nebo select k uložení výsledku a další možné práci s tímto výsledkem orderby (OrderBy, OrderByDescending): slouží k řazení prvků ve výsledku podle definovaných kritérií pro sestupné řazení je možné jej použít s klíčovým slovem descending 06/05/2018

25 LINQ to Objects (4) join (Join, GroupJoin): používá se k propojení prvků z různých datových zdrojů na základě definované podmínky ekvivalence v kombinaci s tímto slovem se používají nová slova equals a on let: slouží k definici lokální proměnné v rámci dotazu do této proměnné může být přiřazena sekvence elementů, nebo jednoduchá hodnota Jmenný prostor System.Linq definuje ještě další rozšiřující metody, které lze v souvislosti s kolekcemi (poli) používat, např.: First, Last: výběr prvního nebo posledního prvku 06/05/2018

26 LINQ to Objects (5) FirstOrDefault , LastOrDefault: ElementAt: Count:
vrací první, resp. poslední prvek výchozí hodnotu daného datového typu v případě, že dotaz vrátil prázdný výsledek ElementAt: vrací prvek podle zadaného indexu Count: vrací počet prvků Union, Intersect, Except: provádí množinové operace (sjednocení, průnik a rozdíl) Min, Max: vrací minimální, resp. maximální hodnotu Sum, Average: vypočítá součet, resp. průměr prvků 06/05/2018

27 LINQ to Objects (6) Reverse: Concat: OfType: Take: Skip: TakeWhile:
obrátí pořadí prvků v kolekci (poli) Concat: spojí dvě sekvence (pole, kolekce) dohromady OfType: výběr pouze těch prvků, které jsou specifikovaného typu Take: vybere prvních n prvků Skip: vybere všechny prvky počínaje (n+1). prvkem TakeWhile: Vybírá prvky dokud není splněna určitá podmínka SkipWhile: přeskakuje prvky, dokud není splněna určitá podmínka 06/05/2018

28 LINQ to Objects (7) Obecný tvar jednoduchého dotazu LINQ: from [typ] proměnná in datový_zdroj [where] podmínka_restrikce [orderby] klíč_řazení [descending] select výraz_projekce; Příklad: int[] numbers = { 1, 2, 3, 4, 5 }; var result = from n in numbers where n < orderby n descending select n; vybere z pole numbers všechna čísla menší než 4 a provede jejich sestupné seřazení 06/05/2018

29 LINQ to Objects (8) Předcházející dotaz může být také zapsán s vy-užitím rozšiřujících metod a lambda výrazů: int[] numbers = { 1, 2, 3, 4, 5 }; var result = numbers.Where(n => n < 4) OrderByDescending(n => n); Dotazy LINQ jsou prováděny s tzv. odloženým spuštěním (deferred execution): dotaz je spuštěn až ve chvíli, kdy je k němu přistou-peno samotné uložení dotazu do proměnné jeho spuštění nevyvolá 06/05/2018

30 LINQ to Objects (9) Příklad: List<int> numbers = new List<int> {1, 2, 3, 4, 5}; var result = from n in numbers where n > select n; numbers.Add(6); foreach (int i in result) Console.Write("{0} ", i); Uvedený program, vypíše hodnoty 4 5 6 06/05/2018


Stáhnout ppt "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."

Podobné prezentace


Reklamy Google