inptp přednáška 01b 2016
TRANSCRIPT
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, 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í 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 - 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í
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í
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í
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.
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í 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ř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.