Transcript Prezentace
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) 2020-04-25 1
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.) 2020-04-25 2
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 2020-04-25 3
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
• Příklad: , za nímž následuje typ delegáta asocio vaného s touto událostí a název události
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 2020-04-25 4
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 2020-04-25 5
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 (EventArgs e) { EventHandler handler = Click; if (handler != null ) handler( this , e); }
– 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é 2020-04-25 6
Soubory a proudy (1)
• Soubor uloženou na externím záznamovém médiu (např. HDD, CD, DVD, BD, tape) • Proud ( ( file ) označuje pojmenovanou sadu dat stream ) představuje „prostředníka“ mezi zdrojem, resp. příjemcem dat (např. soubor) a našim programem • Knihovny dodávané s MS .NET Frameworkem poskytují abstraktní třídu
Stream
(definována ve jmenném prostoru – čtení z proudu –
Read
– zápis do proudu – – přesun v proudu –
System.IO
Write Seek
), jež mimo jiné definuje abstraktní metody pro operace: 2020-04-25 7
Soubory a proudy (2)
• Skutečnost, zda daná operace je na konkrétním proudu dostupná, lze ověřit pomocí vlastností
CanRead
– ,
CanWrite FileStream
( a
CanSeek
• V jazyku C# lze pracovat např. s proudy:
System.IO
): • pro práci se soubory – –
MemoryStream
(
System.IO
): • pro práci s proudy uloženými v operační paměti
NetworkStream
(
System.Net.Sockets
): • pro komunikaci v prostředí počítačové sítě • Poznámka: – výše uvedené proudy jsou definovány jako potomci abstraktní třídy
Stream
2020-04-25 8
Třída
FileStream
(1)
• Instance třídy
FileStream
čtení a k úpravám obsahu souboru • Při vytváření instance třídy se používají ke
FileStream
je možné konstruktoru předat např.: – název souboru (možno zadat včetně cesty) – informace o režimu otevření souboru (
FileMode
): • např. vytvoření nového souboru, otevření existujícího souboru, přidávání dat na konec souboru – informace o – informace o režimu přístupu režimu sdílení používat i jiné proudy ( (
FileAccess FileShare
): ): • soubor určený pro čtení, pro zápis nebo pro čtení i zápis • udávají, zda je soubor určený výlučně pro daný proud, nebo jej současně mohou (pro specifikované operace) 2020-04-25 9
Třída
FileStream
(2)
• Definuje např. vlastnosti: –
Length
: • vrací počet bytů v proudu –
Position
: • vrací nebo nastavuje aktuální pozici v proudu • Načítání informací z proudu (souboru) se pro vádí pomocí metody:
int Read( byte [] a, int offset, int count)
• Metoda
count Read
: – načítá do pole
a
od indexu
offset
nejvýše bytů – vrací počet načtených bytů (nebo nulu, jestliže bylo dosaženo konce proudu) 2020-04-25 10
Třída
FileStream
(3)
– posouvá současnou pozici v proudu za poslední načtený byte • Zápis informací lze realizovat pomocí metody
void Write( byte [] a, int offset, int count)
• Metoda
Write
: – zapisuje do proudu z pole
a count
bytů od indexu
offset
– posouvá současnou pozici v proudu za poslední zapsaný byte • Pro načtení, resp. zápis jednoho bytu je možné použít metodu
ReadByte
, resp.
WriteByte
2020-04-25 11
Třída
FileStream
(4)
• Pro nastavení aktuální pozice v proudu slouží metoda
long Seek( long offset, SeekOrigin origin)
• Parametr: –
offset
: • udává relativní pozici vzhledem k hodnotě parametru
origin
–
origin
: • specifikuje, zda pozice je vztažena k začátku, konci nebo aktuální pozici v proudu • Metoda
Seek
vrací novou pozici v proudu • Po dokončení práce se souborem by měl být příslušný proud uzavřen 2020-04-25 12
Třída
FileStream
(5)
• Soubory lze uzavřít voláním metody
Close
• Metodu
Close
není nutné volat: – stačí zajistit, aby každý proud byl korektně uvolněn – je zapotřebí, aby proud byl uzavřen za všech okol ností • Za účelem uvolňování zdrojů existuje rozhraní
IDisposable
definující metodu
Dispose
, která příslušný zdroj uvolní • Při práci se soubory by měly být použity bloky
try
a
finally
sloužící pro ošetření výjimek 2020-04-25 13
Třída
FileStream
(6)
• Příklad
FileStream fs; try {
:
fs = new FileStream(”data.txt”); fs.Write(…); } finally { if (fs != null ) fs.Dispose(); }
• Jazyk C# umožňuje zjednodušit použití rozhra ní
IDisposable
pomocí klíčového slova
using
2020-04-25 14
Třída
FileStream
(7)
• Příklad
using { }
:
(FileStream fs = new FileStream(”data.txt”)) fs.Write(…);
• Pro čtení (zápis) z (do) proudů je možné také využít třídy: –
BinaryReader
vlastnosti ,
BinaryWriter BaseStream
: • pracují s otevřeným proudem (přístupným pomocí ) jako s binárním souborem • dovolují číst (zapisovat) vestavěné datové typy –
StreamReader
nosti ,
StreamWriter BaseStream
kódování (standardně UTF-8) : • pracují s otevřeným proudem (přístupným pomocí vlast ) na úrovni znaků textu v nějakém • umožňují s obsahem souboru pracovat jako s textem 2020-04-25 15
Třída
BinaryReader
• Definována ve jmenném prostoru
System.IO
• Umožňuje načítání binárních hodnot • Pro vytvoření její instance je zapotřebí mít otevřený proud • Poskytuje zejména metody pro načítání hodnot vestavěných datových typů: –
ReadBoolean
,
ReadByte
,
ReadChar
,
ReadDecimal
,
ReadDouble
,
ReadInt16
,
ReadInt32
,
ReadInt64
,
ReadSByte
,
ReadSingle
,
ReadString
,
ReadUInt16
,
ReadUInt32
,
ReadUInt64
• Po každém načtení se pozice v proudu posune za poslední načtený byte 2020-04-25 16
Třída
BinaryWriter
• Definována ve jmenném prostoru
System.IO
• Umožňuje zápis binárních hodnot • Pro vytvoření její instance je zapotřebí mít otevřený proud • Obsahuje 18x přetíženou metodu
Write
zápis různých vestavěných typů do proudu pro • Při každém zápisu se automaticky posouvá pozice v proudu za poslední (zapsaný) byte • Změnu aktuální pozice v proudu je možné provést i pomocí metody
Seek
2020-04-25 17
Třída
StreamReader
(1)
• Definována ve jmenném prostoru
System.IO
• Potomek abstraktní třídy
TextReader
• Načítá znaky z proudu • Načítání je možné realizovat pomocí metody: – –
int Read()
: • načítá z proudu jeden znak reprezentovaný jako
Int32
• posunuje pozici v proudu za načtený znak
int ReadBlock( char [] buffer, int index, int count)
: • načítá do pole
count
znaků
buffer
od indexu
index
• vrací počet načtených bytů nejvýše • posunuje pozici v proudu za poslední načtený znak 2020-04-25 18
Třída
StreamReader
(2)
–
string ReadLine()
: • načítá z proudu řádek znaků a vrací jej jako řetězec –
string ReadToEnd()
: • načítá z proudu všechny znaky od aktuální pozice až do jeho konce (vrací je jako řetězec) 2020-04-25 19
Třída
StreamWriter
• Definována ve jmenném prostoru
System.IO
• Potomek abstraktní třídy
TextWriter
• Zapisuje znaky do proudu • Zapisování je možné realizovat pomocí přetíže ných metod: – –
Write ()
: • zapisují data různých datových typů (v závislosti na pře tížené variantě) do proudu
WriteLine ()
: • zapisují data různých datových typů (v závislosti na pře tížené variantě) do proudu • za poslední zapsaný znak zapisují symbol konce řádku 2020-04-25 20
Třídy
StringReader
a
StringWriter
• Definovány ve jmenném prostoru
System.IO
• Třída: – –
StringReader StringWriter
je potomkem třídy
TextReader
je potomkem třídy
TextWriter
• Umožňují práci obdobným způsobem jako třídy
StreamReader
a
StreamWriter
• Operace však neprobíhají nad proudy (soubory), ale nad řetězci • Vhodné pro práci s textovými informacemi ulo ženými v operační paměti 2020-04-25 21
Manipulace se soubory
• K provádění operací se soubory (vytváření, ko pírování, mazání, přesouvání, otevírání apod.) je možné využít třídy: – –
File
(
System.IO
): • statická třída, která definuje statické metody, např.:
Copy
,
Create
,
Delete
,
Exists
,
GetAttributes
,
GetCreationTime
,
Move
,
Open
,
SetAttributes
,
SetCreationTime FileInfo
(
System.IO
): • definuje: – vlastnosti, např.:
Attributes
,
CreationTime
,
DirectoryName
,
Exists
,
Extension
,
Length
,
Name
– instanční metody, např.:
CopyTo
,
Create
,
Delete
,
MoveTo
,
Open
2020-04-25 22
Manipulace s adresáři
• K provádění operací s adresáři (vytváření, mazá ní, přesouvání, zjišťování souborů a podadresářů v adresáři apod.) je možné využít třídy: –
Directory
(
System.IO
CreateDirectory
, ): • statická třída, která definuje statické metody, např.:
Delete
,
Exists
,
GetCreationTime
,
GetCurrentDirectory
,
GetDirectories
,
GetFiles
,
GetLogicalDrives
,
Move
,
SetCreationTime
,
SetCurrentDirectory
–
DirectoryInfo
(
System.IO
): • definuje: – vlastnosti, např.:
Attributes
,
CreationTime
,
Exists
,
Extension
,
Name
– instanční metody, např.:
Create
,
CreateSubDirectory
,
Delete
,
GetDirectories
,
GetFiles
,
MoveTo
2020-04-25 23
Třída
Path
• Statická třída, která provádí operace nad řetězci, jež obsahují informace o adresářových (soubo rových) cestách • Definuje statické metody, např.: –
ChangeExtension
: mění příponu – – –
Combine
: vytváří z pole řetězců cestu
GetExtension
: vrací příponu
GetFileName
: vrací jméno a příponu – –
GetFileNameWithoutExtension
: vrací jméno bez přípony
GetRandomFileName
: vrací náhodné jméno souboru nebo adresáře 2020-04-25 24
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 2020-04-25 25
LINQ (2)
• LINQ: – 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
– XML – SQL databázích 2020-04-25 26
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ů konstruktoru) • příklad:
Dog dog = new
: • umožňují v době vytváření objektů nastavit jejich vlast nosti a datové položky (bez nutnosti použití specifického
Dog { Name = ”Rex”, Age = 5 } ;
2020-04-25 27
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
2020-04-25 28
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 2020-04-25 29
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
– 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 2020-04-25 30
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
) • 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 2020-04-25 31
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 2020-04-25 32
LINQ to Objects (3)
–
group
(
GroupBy
): • 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
2020-04-25 33
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 2020-04-25 34
– – – – – –
LINQ to Objects (5)
FirstOrDefault
,
LastOrDefault
: • 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ů 2020-04-25 35
– – – – – – –
LINQ to Objects (6)
Reverse
: • 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 2020-04-25 36
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 var [] numbers = { result = from 1, 2, 3, 4, 5 n in } ; numbers where n < 4 orderby n descending select n;
vybere z pole
numbers
všechna čísla menší než 4 a provede jejich sestupné seřazení 2020-04-25 37
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á 2020-04-25 38
LINQ to Objects (9)
• Příklad:
List< int > numbers = var new List< int > result = from n in { 1, 2, 3, 4, 5 } ; numbers where select n > 3 n; numbers.Add(6); foreach ( int i in result) Console.Write("{0} ", i);
• Uvedený program, vypíše hodnoty 4 5 6 2020-04-25 39
Rozšiřující přednášky
• Datum : 10. 4. 2014 • Vyučující : Bc. Radim Göth • Téma : Úvod do Entity Frameworku a ASP.NET MVC • Datum : 17. 4. 2014 • Vyučující : David Kadlec • Téma : Praktická ukázka ASP.NET Web Forms 2020-04-25 40