inptp přednáška 01b 2016

38
INPTP Pokročilé techniky programování (FEI UPa, 2016/2017)

Upload: jan-hridel

Post on 19-Feb-2017

96 views

Category:

Education


0 download

TRANSCRIPT

INPTPPokročilé techniky programování (FEI UPa, 2016/2017)

Náplň předmětu

Náplň předmětu (orientačně)

● Úvod do předmětu, opakování.● Rozšiřující metody, deklarace proměnné

bez udání typů, anonymní typy.● Generické kolekce.● LINQ● LINQ to ADO.NET● Úvod do technologií WPF a ASP.NET.● WPF I● WPF II● WPF III

● ASP.NET I● ASP.NET II● ASP.NET III● Souběžnost

Co byste měli znát

Co byste měli znát, aneb nutné základy C#

● .NET Framework● Dokumentační komentáře● Konvence pojmenování● Deklarace proměnných a konstant● Prostory jmen● Direktiva using● Operátor ::● Hodnotové typy

Co byste měli znát, aneb nutné základy C#

● Referenční typy● Systémové třídy● Zabalení● Konstrukce příkazů● Rozhodování● Cykly● Skoky● Příkaz lock

Co byste měli znát, aneb nutné základy C#

● Příkaz yield● Příkaz try● Operátory● Preprocesor● Třídy● Rozhraní● Výjimky● Přetěžování operátorů

Co byste měli znát, aneb nutné základy C#

● Soubory, vstupy a výstupy● Formátování● Datum a čas● Použití kultury

Rozšiřující metody

Rozšiřující metody

Rozšiřující metoda (angl. extension method) umožňuje přidat metodu k existujícímu typu bez nutnosti vytvoření nového odvozeného typu.

syntaxe

this typ identifikátor

Rozšiřující metody - příklad

Vizhttps://goo.gl/cOUxSU

Rozšiřující metody - doporučení

Je doporučeno implementovat rozšiřující metody jen v případě, kdy je to nutné. Je-li to možné, měla by se třída rozšířit definováním jejího potomka.

Rozšiřující metody v knihovně .NET

Součástí knihovny .NET je třída Enumerable, která obsahuje rozšiřující metody pro generické rozhraní IEnumerable<T>.

Datový typ, který implementuje rozhraní IEnumerable<T>, je běžně označován jako sekvence.

Rozšiřující metody v knihovně .NET

Řada metod třídy Enumerable pracuje s parametrem typu generického delegátu Func. Existuje několik verzí tohoto delegátu:

● delegate TResult Func<TResult>()● delegate TResult Func<T, TResult>(T arg)● delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2)● delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3)● delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3,T4 arg4)

Rozšiřující metody v knihovně .NET

Např. jedna z verzí metody Count má následující tvar:

int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

Rozšiřující metody v knihovně .NET

Některé metody vrací sekvenci prvků. Např. metoda Where, která vrací sekvenci prvků, v níž jsou obsaženy prvky zadané sekvence vyhovující zadanému predikátu. Jedna z verzí má následující tvar:

IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate)

Příklad

class Program { static void Main(string[] args) { int[] cisla = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; Console.WriteLine("Minimální číslo: {0}", cisla.Min()); Console.WriteLine("Počet sudých čísel: {0}", cisla.Count(x => x % 2 == 0)); Console.WriteLine("Maximální sudé číslo: {0}", cisla.Where(x => x % 2 == 0).Max()); Console.ReadKey();}}

Odložené vykonávání

Odložené vykonávání

Metody, které vrací sekvenci, jako např. metoda Where, implementují tzv. odložené vykonání (angl. deferred execution).

Tyto metody pouze vrací instanci nějaké třídy, která obsahuje informace potřebné k provedení příslušné akce.

Odložené vykonávání - příklad

Viz

https://goo.gl/KyMb5N

Odložené vykonávání

Odloženému vykonávání lze zamezit, pokud se sekvence převede na konkrétní kolekci pomocí některé z následujících metod:

● ToArray – převod na pole typu TSource[],● ToDictionary – převod na slovník typu Dictionary<TKey,

TSource>,● ToList – převod na seznam typu List<TSource>.● ToLookup – převod na třídu typu Lookup<TKey, TSource>

Řazení

Řazení

Pro seřazení sekvence vzestupně slouží metoda OrderBy:

IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)

Řazení

Pro sestupné seřazení slouží metoda OrderByDescending a má také dvě verze se stejnou signaturou jako metoda OrderBy.

Řazení - příklad

Viz

https://goo.gl/IgyJxz

Použití negenerických kolekcí, projekce

viz cvičení

Seskupování

viz cvičení

Deklarace proměnné bez udání typu

Deklarace proměnné bez udání typu

Lokální proměnnou lze deklarovat bez udání typu. Místo označení typu lze použít klíčové slovo var. Jedná se o tzv. deklaraci implicitně typové lokální proměnné (angl. implicitly typed local variable).

Syntaxe:

var identifikátor inicializace;

Deklarace proměnné bez udání typu- příklad

var a = 5*3; // a je typu int

a = 10.5; // chyba – nelze konvertovat double na int

var s = "Text"; // s je typu string

var pole = new int[] { 1, 2, 3 }; // pole je typu int[]

Deklarace proměnné bez udání typu

Oproti deklaraci normální lokální proměnné se tato deklarace liší následovně:

● Nelze uvést modifikátor const.● Část inicializace je povinná a musí představovat pouze výraz. Nelze místo

výrazu uvést inicializátor pole.● Výraz v inicializaci musí být vyhodnotitelný v době překladu.● V rámci jednoho příkazu deklarace nelze deklarovat více proměnných.

Deklarace proměnné bez udání typu- příklad

● var a; // Chyba - proměnná bez inicializace● var pole = { 1, 2, 3 };// Chyba - nelze použít

inicializátor pole● int[] pole2 = { 1, 2, 3 }; // OK● var b = null; // Chyba – null nemá typ● var a1 = 0, a2 = 1;// Chyba – deklarace více proměnných● int a1 = 0, a2 = 1; // OK

Deklarace proměnné bez udání typu

Implicitně typové proměnné lze používat také v příkazech obsahujících deklaraci lokální proměnné, např.:

for (var i = 0; i < 5; i++)

foreach (var item in pole)

using (var file = new StreamWriter("data.txt"))

Klíčové slovo var nelze použít v deklaraci datové složky třídy nebo struktury.

Anonymní typy

Anonymní typy

Anonymní typ slouží k zapouzdření množiny vlastností určených pouze pro čtení do instance nepojmenované třídy. Jméno typu je generováno překladačem a není ve zdrojovém kódu přístupné.

Anonymní typy

Syntaxe:new inicializátor_instance_anonymního_typuinicializátor_instance_anonymního_typu: { seznam_deklarátorů_složeknep }seznam_deklarátorů_složek: deklarátor_složkydeklarátor_složky: identifikátor = výraz

Anonymní typy - příklad

var osoba = new { Jmeno = "Josef", Vek = 10*2 };

Anonymní typy

Překladač vždy vytvoří třídu odvozenou přímo z třídy object s modifikátorem internal. Třída bude obsahovat následující složky:

● Veřejné vlastnosti určené jen pro čtení, odpovídající jednotlivým deklarátorům. Typ vlastnosti překladač odvodí z výrazu, kterým je vlastnost inicializována.

● Veřejný konstruktor – inicializuje podkladové datové složky vlastností.

● Předefinovaná metoda Equals – volá metodu Equals pro všechny vlastnosti třídy.

● Předefinovaná metoda GetHashCode – vrací hešovací kód z hodnot všech vlastností třídy.