P V178 – Úvod do vývoje v C # /.NET
description
Transcript of P V178 – Úvod do vývoje v C # /.NET
PV178 – Úvod do vývoje v C#/.NET
RNDr. Jaroslav PELIKÁN, Ph.D.
katedra počítačových systémů a komunikací
Fakulta informatiky Masarykovy univerzity
Botanická 68a, 602 00 BRNO
Kanc.: A209, : +420 – 549 495 751
E-mail: [email protected]
http://www.fi.muni.cz/usr/pelikan
23-04-20 2
Cíle předmětu• Osvojit si základní návyky tvorby kvalitního
kódu v jazyce C#• Po absolvování tohoto předmětu by student
měl:– znát základní kroky a techniky doprovázející
proces vývoje aplikací v C#/.NET– ovládat prostředí Visual Studio– znát hlavní rysy a programové konstrukce pro-
gramovacího jazyka C#– být schopen psát kvalitní objektový kód
23-04-20 3
Organizace předmětu• Rozsah (hodinová dotace): 1/2• Přednáška:
– 2 hodiny týdně– prvních 7 týdnů
• Cvičení:– 2 hodiny týdně– celý semestr
23-04-20 4
Používané technologie
• Výuka probíhá s využitím:– programovacího jazyka C#– platformy MS .NET Framework– vývojového prostředí MS Visual Studio:
• studenti Fakulty informatiky mohou získat Visual Studio Community 2015 prostřednictvímMicrosoft Imagine(přístup přes Autentizované služby na stránce http://fadmin.fi.muni.cz/ a odkaz MSDN AA)
23-04-20 5
Vstupní předpoklady
• Znalost: – základů programování a algoritmizace– syntaxe programovacího jazyka C/C++ nebo
Java– základů objektově orientovaného programování –
na úrovni předmětu:• PB161 Programování v jazyce C++
nebo• PB162 Programování v jazyce Java
23-04-20 6
Osnova (1)• Úvod do C#/.NET:
– architektura .NET Frameworku– charakteristika jazyka C#, program v jazyce C#– typový systém– třída a její členy– předávání parametrů metodám– vlastnosti (properties)– rozhraní– struktury– jmenné prostory
• Výčtové datové typy, indexery, pole
23-04-20 7
Osnova (2)• Generické datové typy, kolekce• Řetězce, iterátory, výjimky• Delegáty, anonymní metody, lambda výrazy,
události• LINQ – jednotný přístup k datům a jejich
zpracování• Práce se soubory a proudy• Práce s daty (XML, JSON):
– serializace/deserializace tříd– ADO.NET
23-04-20 8
Osnova (3)• Reflexe – získávání typových informací
v době běhu programu• Regulární výrazy – třída Regex• Paralelní zpracování (multithreading)• Asynchronní programování
23-04-20 9
Literatura• Pelikán, Jaroslav: Prezentace k přednáškám z před-
mětu PV178 Úvod do vývoje v C#/.NET, http://www.fi.muni.cz/usr/pelikan
• Richter, Jeffrey: CLR via C#, 3rd ed. Redmond: Microsoft Press, 2010, ISBN: 9780735627048.
• Skeet, Jon: C# in depth, 2nd ed. Stamford: Manning, 2011, ISBN: 9781935182474.
• Marguerie, Fabrice, Steve Eichert, Jim Wooley: Linq in action, Edited by Matt Warren, Greenwich: Manning, 2008, ISBN: 9781933988160.
• Sharp, John: Microsoft Visual C# 2010, Computer Press 2010, ISBN: 978-80-251-3147-3.
23-04-20 10
Ukončení předmětu• V průběhu semestru je možné získat maxi-
málně 100 bodů:– 54 bodů: domácí úkoly– 16 bodů: testy na cvičeních– 30 bodů: závěrečný test
• Při ukončení předmětu:– kolokviem je zapotřebí získat min. 70 bodů– zápočtem je zapotřebí získat min. 60 bodů
• Poznámka:– docházka na cvičení nebude kontrolována– neúčastí na cvičeních přicházíte o možnost bodů
z testů
23-04-20 11
.NET Framework (1)• Softwarová platforma vyvinutá firmou Micro-
soft, která podporuje vytváření a spouštění aplikací a webových služeb
Operační systém
Common Language Runtime
Base Class Library
ADO.NET & XML
ASP.NETWeb Forms Web Services
WindowsForms
Common Language Specification
VB C++ C# J# …
Vis
ual S
tudi
o .N
ET
Arc
hite
ktur
a .N
ET
F
ram
ewor
k 2.
0
23-04-20 12
.NET Framework (2)• CLR – Common Language Runtime:
– běhové prostředí realizující základní infrastruk-turu, nad kterou je celý framework vybudován
– provádí spouštění všech programů napsaných pro .NET Framework (nezávisle na použitém programovacím jazyku)
– lze přirovnat k virtuálnímu stroji u jazyka Java– zajišťuje např.:
• spouštění programů• správu paměti (včetně automatické garbage collec-
tion), výpočetních vláken (threads), výjimek• typovou bezpečnost
23-04-20 13
.NET Framework (3)
• BCL – Base Class Library:– knihovna dodávaná s .NET Frameworkem– obsahuje třídy sloužící pro práci např. s:
• grafikou• soubory• databází• počítačovou sítí
• ADO.NET & XML:– knihovna pro přístup k datům a pro práci s
XML soubory
23-04-20 14
.NET Framework (4)
• ASP.NET:– soubor technologií pro tvorbu webových aplika-
cí a webových služeb
• Windows Forms:– programové rozhraní pro vývoj grafických
desk-topových aplikací– poskytuje sadu tříd umožňujících přístup ke
standardním ovládacím prvkům operačního sys-tému MS Windows (okno, tlačítko, menu, editační prvek atd.)
23-04-20 15
.NET Framework (5)• CLS – Common Language Specification:
– definuje základní vlastnosti programovacích ja-zyků podporované běhovým prostředím CLR
• .NET Framework 3.0:– přináší čtyři hlavní nové komponenty:
• WPF – Windows Presentation Foundation:– rozhraní pro vytváření grafických aplikací a jejich uživatel-
ských rozhraní– založeno na XML a vektorové grafice– při své činnosti využívá Direct3D
• WCF – Windows Communication Foundation:– technologie pro vývoj webových služeb a komunikační
infrastruktury aplikací– umožňuje vytváření aplikací orientovaných na služby
(SOA – Service Oriented Application)
23-04-20 16
.NET Framework (6)• WF – Windows Workflow Foundation:
– technologie pro definování (modelování) heterogenních sekvenčních procesů
• Windows CardSpace:– programová komponenta, která bezpečně ukládá digitální
identity a poskytuje jednotné rozhraní pro volbu identity k určité transakci
• .NET Framework 3.5:– přidává dvě komponenty pro datové služby:
• ADO.NET Entity Framework• ADO.NET Data Services
– poskytuje LINQ:• komponenta umožňující jednotný přístup k datům a jejich zpra-
cování deklarativním a funkcionálním způsobem
23-04-20 17
.NET Framework (7)• .NET Framework 4.0:
– přináší zejména Parallel Extensions zlepšující podporu paralelních výpočtů u vícejádrových a distribuovaných systémů:
• PLINQ:– paralelní implementace technologie LINQ
• Task Parallel Library:– množina tříd umožňující efektivní zpracování úloh s využi-
tím všech dostupných jader procesoru
• .NET Framework 4.5:– doplňuje podporu pro:
• aplikace typu Metro Style• asynchronní programování
23-04-20 18
Životní cyklus aplikace (1)
• CIL – Common Intermediate Language:– dříve nazývaný jako MSIL – Microsoft Interme-
diate Language– jazyk nezávislý na platformě, do něhož jsou pře-
kládány programy napsané v jazycích kompati-bilních s .NET Frameworkem
C#zdrojový kód
VBzdrojový kód
J#zdrojový kód
Překladač
Překladač
Překladač
CIL CLR
1011
1011
0010
10
CLI
JIT
23-04-20 19
Životní cyklus aplikace (2)
• CLI – Common Language Infrastructure:– otevřená a standardizovaná specifikace– popisuje vlastnosti spustitelného kódu a prostře-
dí pro jeho běh– umožňuje, aby aplikace byly napsány v různých
vyšších programovacích jazycích a následně spouštěny v rozličných prostředích
– součástí CLI je i CTS – Common Type System popisující datové typy a typový systém
– mezi implementace CLI patří CLR a Mono
23-04-20 20
Životní cyklus aplikace (3)• JIT – Just-In-Time compilation:
– realizována JIT překladačem, který je součástí CLR
– provedena v okamžiku, kdy systém detekuje, že dochází ke spuštění aplikace v CIL
– během ní dochází k vygenerování strojového kódu, který může být spuštěn na aktuálně použí-vané platformě
– výsledný kód běží ve virtuálním stroji .NET Frameworku jedná se o řízený kód (managed code)
23-04-20 21
Programovací jazyk C#• Vyvinutý v rámci platformy MS .NET• Jedná se o objektově orientovaný jazyk• Založen na jazycích C++ a Java• Syntaxe C# je podobná syntaxi jazyka C (Java)• Lze jej využít k tvorbě např.:
– desktopových aplikací– webových aplikací, webových služeb a stránek– programů pro mobilní zařízení (PDA, mobilní
telefony)– databázových programů
23-04-20 22
Program v jazyce C# (1)• Tvořen třídami a jejich členy (members)
• Třídy a další datové typy jsou organizovány ve jmenných prostorech (namespace) a mo-hou být vnořovány do jiných tříd
• Vstupním bodem každého programu v C# je metoda (funkce obsažená v typu třída) Main:– může být v programu pouze jedna– jedná se o statickou metodu– návratovým typem může být void nebo int– může přijímat parametry z příkazové řádky OS
23-04-20 23
Program v jazyce C# (2)
• Metoda Main může mít jednu z následujících signatur:– static void Main()– static void Main(string[] args) – static int Main()– static int Main(string[] args)
• Poznámka:– jazyk C# podobně jako jazyk C/C++ rozlišuje
velká a malá písmena (jazyk case sensitive)
23-04-20 24
Standardní výstup (1)• Pro zobrazení hodnot na standardní výstup je
možné použít statické metody definované ve statické třídě Console:– Write:
• po vypsání posledního znaku neprovádí odřádkování
– WriteLine:• po vypsání posledního znaku provádí odřádkování
• Poznámka:– třída Console je definována ve jmenném
prostoru System
23-04-20 25
Standardní výstup (2)
• Prvním parametrem uvedených metod může být řetězec obsahující (kromě textu) specifi-kace, které určují místa, na nichž mají být vy-psány hodnoty dalších parametrů
• Specifikace se zapisují ve složených závor-kách, jež obsahují pořadové číslo vypisova-ného parametru
• Příklad:Console.Write("a = {0}, b = {1}", a, b);
23-04-20 26
Standardní výstup (3)
• Poznámky:– součástí specifikace mohou být i informace
o tom, jakým způsobem má být hodnota odpo-vídajícího parametru formátována
– je-li zapotřebí vypsat hodnotu pouze jednoho parametru, je možné řetězec (jako první para-metr) vynechat
23-04-20 27
Standardní vstup• Pro načtení hodnoty ze standardního vstupu
jsou ve třídě Console definovány statické metody: – Read:
• načítá ze standardního vstupu jeden znak• vrácená hodnota je typu int
– ReadLine:• načítá ze standardního vstupu celý řádek• vrácená hodnota je typu string
• Poznámka:– pro převody mezi různými datovými typy lze
použít metody statické třídy Convert (defi-nována ve jmenném prostoru System)
23-04-20 28
Hodnotové a referenční typy (1)• Každý typ v jazyce C# je přímo nebo nepří-
mo odvozen od třídy object • Hodnotové typy (value types):
– jejich proměnné přímo nesou (obsahují) svá data– každá proměnná má svou vlastní kopii dat– změna hodnoty jedné proměnné neovlivňuje
hodnotu proměnné jiné– jsou ukládány na zásobníku – patří mezi ně většina předdefinovaných typů
(vyjma object a string) a výčtové typy– pro vytvoření vlastních hodnotových typů slouží
struktury
23-04-20 29
Hodnotové a referenční typy (2)
• Referenční (odkazové) typy (reference types):– jejich proměnné ukládají odkaz (referenci) na
data (objekty)– pokud dojde k přiřazení proměnné, tak dojde ke
zkopírování odkazu – je možné, aby dvě proměnné obsahovaly odkaz
na stejný objekt – operace nad jednou proměnnou může ovlivnit
objekt, na nějž se odkazuje proměnná jiná– v paměti jsou ukládány na spravované haldě
(managed heap)
23-04-20 30
Předdefinované datové typy (1)• Jazyk C# poskytuje sadu předdefinovaných
datových typů, které se nachází ve jmenném prostoru System
• Jednotlivé datové typy (vyjma typu string a object) jsou synonymy struktur, které obsahují metody tyto metody lze pomocí tečkové notace volat
• Všechny tyto struktury poskytují např. meto-du ToString, která vrací řetězec reprezen-tující současný objekt
23-04-20 31
Předdefinované datové typy (2)Typ Popis Velikost Typový ekvivalent
sbyte celočíselný typ 8 b System.SByte
double reálný typ (s dvojitou přesností) 64 b System.Double
float reálný typ (s jednoduchou přesností) 32 b System.Single
int celočíselný typ 32 b System.Int32
long celočíselný typ 64 b System.Int64
byte celočíselný typ 8 b System.Byte
short celočíselný typ 16 b System.Int16
uint celočíselný typ 32 b System.UInt32
ushort celočíselný typ 16 b System.UInt16
ulong celočíselný typ 64 b System.UInt64
se znaménkem
bez znaménka
23-04-20 32
Předdefinované datové typy (3)
Typ Popis Velikost Typový ekvivalent
string posloupnost znaků (řetězec) 16 b / znak System.String
• Poznámka:– datové typy string a object jsou popsány
jako třídy (nikoliv jako struktury)
decimal peněžní hodnoty (28 platných číslic) 128 b System.Decimal
char znakový typ (Unicode, UTF-16) 16 b System.Char
bool logický (booleovský) typ 8 b System.Boolean
object kořen objektové hierarchie System.Object
23-04-20 33
Nulovatelné typy (1)• Nulovatelné (nullable) typy představují rozší-
ření, jež umožňuje přiřazovat hodnotu null do proměnných všech hodnotových typů
• Hodnota null vyjadřuje, že proměnná nemá žádnou hodnotu
• Vhodné zejména pro pohodlnou práci s SQL a s relačními databázemi (ve sloupci databáze může být hodnota NULL)
• Zapisovány pomocí otazníku za názvem typu
• Příklad:int? x;
23-04-20 34
Nulovatelné typy (2)• Poskytují vlastnosti (určené pouze pro čtení):
– Value:• obsahuje hodnotu dané proměnné• je-li hodnota proměnné null, pak způsobí výjimku• pro změnu hodnoty se používá přiřazení přímo do
proměnné– HasValue:
• booleovská vlastnost:– false:
• vyjadřuje, že proměnná nemá žádnou hodnotu• nastaví se automaticky, je-li do proměnné přiřazena
hodnota null– true:
• vyjadřuje, že proměnná má určitou hodnotu• nastaví se automaticky, je-li do proměnné přiřazena jiná
hodnota než null
23-04-20 35
Nulovatelné typy (3)• Konverze:
– nenulovatelného typu na nulovatelný je provádě-na implicitně
– nulovatelného typy na nenulovatelný musí být provedena explicitně
• Příklad:int? age1 = 30; int? age2 = null;int age3 = 0;
age3 = (int)age1;age2 = age3;
23-04-20 36
Null coalescing operator (1)• Null coalescing (null splývající) operátor je
zapisovaný ve tvaru výrazu:A ?? B
• Výsledek výrazu je:– A: jestliže A neobsahuje hodnotu null– B: v opačném případě
• Jestliže A obsahuje hodnotu null, pak B poskytne hodnotu k použití
• Používaný k definici implicitní hodnoty pro nulovatelné hodnotové nebo referenční typy
23-04-20 37
Null coalescing operator (2)• Příklad:int? x = null;int? y = 10;
int? z = x ?? y;int i = z ?? 4;
Console.WriteLine("z = {0}", z);Console.WriteLine("i = {0}", i);
• Na výstupu bude vypsáno:z = 10i = 10
23-04-20 38
Implicitně typované proměnné
• Definované pomocí klíčového slova var (bez použití identifikátoru označujícího datový typ)
• V době definice musí být provedena i jejich inicializace
• Představují silně typované proměnné
• Jejich typ je určen z pravé strany inicializace
• Příklad: var distance = 20; //int
23-04-20 39
Datový typ třída – class (1)• Datový typ definovaný uživatelem
• Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace
• Charakterizuje vlastnosti a chování objektů
• Je možné ji definovat pomocí klíčového slova class
• Může obsahovat následující členy:– konstanty (constants)– datové položky (fields)
23-04-20 40
Datový typ třída – class (2)– metody (methods)– konstruktory instance (instance constructors)– statické konstruktory (static constructors)– finalizery (finalizers)– vlastnosti (properties)– události (events)– indexery (indexers)– operátory (operators)– vnořené deklarace typů (nested type declarations)
23-04-20 41
Datový typ třída – class (3)• Každý člen uvnitř třídy má svoji tzv. přístup-
nost (accessibility) určující, jakým způsobem je nebo není přístupný (viditelný) zvenčí
• Nejčastěji se používá přístupnost:– public (veřejná):
• přístup k danému členu není nijak omezován
• člen je přístupný uvnitř i vně dané třídy
– private (privátní, soukromá):• daný člen je přístupný pouze uvnitř třídy, v níž je defi-
nován
• jedná se o implicitní přístupnost k členu
23-04-20 42
Datový typ třída – class (4)• Datové položky (fields):
– reprezentují proměnné spojené s objektem nebos třídou
– slouží k uchování informací• Metody (methods):
– funkce definované uvnitř třídy– implementují výpočet (akci), který může být pro-
veden objektem nebo třídou– obsahují:
• seznam formálních parametrů (může být i prázdný)• návratovou hodnotu (je-li návratovým typem metody
typ void, pak metoda nevrací žádnou hodnotu)
23-04-20 43
Datový typ třída – class (5)• Konstruktory instancí (instance constructors):
– speciální typy metod– slouží k vytvoření instance třídy (objektu)– mají stejný název jako třída– mohou obsahovat formální parametry– nemohou vracet žádnou hodnotu (ani void)
v jejich hlavičce není uvedený žádný návratový typ– jedna třída může obsahovat více konstruktorů (pře-
těžování – overloading)– není-li definován žádný konstruktor, pak překladač
automaticky vygeneruje konstruktor implicitní, kte-rý neobsahuje žádné parametry
23-04-20 44
Datový typ třída – class (6)• Příklad třídy:class Square{
private int side;
public Square(int initialSide){
side = initialSide;}public int GetArea(){ return side*side;}
}
23-04-20 45
Datový typ třída – class (7)• Na základě datového typu třída lze vytvořit
její instanci • Instanci typu třída označujeme jako objekt• Objekt je vytvářen pomocí klíčového slova new (způsobí vyvolání konstruktoru)
• Příklad:Square sq;sq = new Square(5);neboSquare sq = new Square(5);
23-04-20 46
Datový typ třída – class (8)• Proměnná sq bude obsahovat odkaz, kde je
v paměti uložený objekt (třída je referenční datový typ)
• Poznámka:– každá instance třídy je objektem, který zabírá
svůj vlastní prostor v paměti a běží nezávisle na všech ostatních instancích
• Pro zpřístupnění členů třídy se používá tečko-vá notace:– identifikátor proměnné typu třída nebo typu třída– symbol tečka– identifikátor označující člen třídy
23-04-20 47
Datový typ třída – class (9)• Příklad:int s;Square sq = new Square(5);
s = sq.GetArea();• Metody i datové položky mohou být deklaro-
vány jako statické (static):– zpřístupňovány prostřednictvím třídy– před jejich zpřístupněním není nutné vytvářet in-
stanci třídy (objekt)– nezávislé na konkrétní instanci třídy
23-04-20 48
Datový typ třída – class (10)
• Poznámka:– metoda Main musí být statická, protože před je-
jím voláním se nevytváří instance třídy, v níž je definována
• Statické třídy:– deklarovány s použitím klíčového slova static– může obsahovat pouze statické členy– nemůže obsahovat žádná data ani metody instancí– příklad: třídy Math, Convert, Console
23-04-20 49
Předávání parametrů metodám (1)• Parametry předávané hodnotou:
– deklarovány bez použití modifikátoru ref nebo out
– u hodnotových typů:• dochází k předání kopie dat ze skutečného parametru
do parametru formálního• změny provedené uvnitř metody nad formálním para-
metrem nijak neovlivňují hodnotu parametru skuteč-ného
– u referenčních typů:• dochází pouze k předání odkazu• jestliže metoda hodnotu přijatého objektu změní, pak
se změna projeví i v původním objektu– skutečný parametr musí být v době volání inicia-
lizovaný, tj. musí mít přiřazenou hodnotu
23-04-20 50
Předávání parametrů metodám (2)• Parametry předávané odkazem:
– před formálním i skutečným parametrem musí být uveden modifikátor ref
– nedochází k vytvoření nového paměťového místa pro formální parametr
– formální parametr reprezentuje stejné paměťové místo, které náleží parametru skutečnému
– všechny změny provedené nad formálním para-metrem se promítají do parametru skutečného
– skutečný parametr musí být v době volání inicia-lizovaný, tj. musí mít přiřazenou hodnotu
23-04-20 51
Předávání parametrů metodám (3)• Parametry výstupní:
– před formálním i skutečným parametrem musí být uveden modifikátor out
– podobné chování jako u parametrů předávaných odkazem
– všechny změny provedené nad formálním para-metrem se promítají do parametru skutečného
– skutečný parametr nemusí být v době volání ini-cializovaný, tj. nemusí mít přiřazenou hodnotu
– v průběhu metody mu musí být přiřazena hodnota
23-04-20 52
Vlastnosti (1)• Členy třídy umožňující přístup k charakteris-
tickým atributům objektu nebo třídy, např.:– délka řetězce– velikost fontu– titulek okna– jméno zákazníka– apod.
• Představují rozšíření datových položek:– pojmenované členy s daným datovým typem– používají stejnou syntaxi pro své zpřístupnění
23-04-20 53
Vlastnosti (2)
• Na rozdíl od datových položek nereprezentují paměťové místo pro uložení hodnoty
• Překladač automaticky převádí zpřístupnění vlastností na volání přístupových metod
• Přístupové metody specifikují příkazy, jež mají být provedeny při:– čtení hodnoty vlastnosti– změně hodnoty vlastnosti (zápisu)
23-04-20 54
Vlastnosti (3)• Přístupové metody jsou zapisovány pomocí
klíčových slov: – get: uvozuje přístupovou metodu pro čtení– set: uvozuje přístupovou metodu pro zápis
• Zapisovaná data jsou přístupovým metodám (set) předávána pomocí vestavěného (skry-tého) parametru value
• Konvence:– soukromé datové položky jsou psány s malým po-
čátečním písmenem, zatímco veřejné vlastnosti s počátečním písmenem velkým
23-04-20 55
Vlastnosti (4)• Příklad:class Square{
private int side;public int Side{
get { return side;
} set {
side = value;}
}
}
23-04-20 56
Vlastnosti (5)• Nechť je dána deklarace:int s;Square sq = new Square(5);
• Vlastnost Side lze zpřístupnit:– pro čtení – např.:s = sq.Side; (volá sq.Side.get)
– pro zápis – např.:sq.Side = 2*s; (volá sq.Side.set)
• Vlastnost může obsahovat pouze metodu:– get: vlastnost určena jen pro čtení– set: vlastnost určena jen pro zápis
23-04-20 57
Vlastnosti (6)• Omezení vlastnosti:
– vlastnost nelze použít jako parametr s modifiká-torem ref nebo out (za vlastností se skrývá pří-stupová metoda nikoliv paměťové místo)
– vlastnost může obsahovat jednu přístupovou me-todu get a jednu přístupovou metodu set (ne-smí obsahovat žádné jiné metody, datové polož-ky nebo vlastnosti)
– přístupové metody nesmí přijímat žádné paramet-ry (zapisovaná data jsou u metody set předává-na prostřednictvím value)
– u vlastností nelze používat modifikátor const
23-04-20 58
Vlastnosti (7)• Jestliže metody get, resp. set provádějí
pouze operace, které slouží k přečtení, resp. přiřazení do datové položky, pak je možné jejich příkazovou část vynechat
• Příklad:class Square{
public int Side { get; set; }
}
23-04-20 59
Vlastnosti (8)• Překladač automaticky vygeneruje odpovída-
jící programový kód:class Square{
private int _side;public int Side{
get { return _side; } set { _side = value;}
}
}
23-04-20 60
Rozhraní (1)• Rozhraní (interface) definuje kontrakt s třídou
nebo strukturou, která je následně od tohoto rozhraní odvozena
• Představuje seznam členů, které se odvozená třída nebo struktura zavazuje implementovat
• Platí, že:– jedno rozhraní může dědit od jednoho nebo více
jiných rozhraní– jedna třída může implementovat jedno nebo více
rozhraní (může dědit pouze od jedné třídy)
• Dovoluje „nahradit“ vícenásobnou dědičnost
23-04-20 61
Rozhraní (2)• Umožňují třídám přidávat charakteristiky
nebo schopnosti nezávisle na hierarchii tříd• Rozhraní může obsahovat:
– metody– události– vlastnosti– indexery
• Definice rozhraní:– začíná klíčovým slovem interface, za nímž
následuje jméno rozhraní– obsahuje pouze signatury členů (nikoliv jejich
implementace)
23-04-20 62
Rozhraní (3)• Všechny členy jsou automaticky veřejné (ma-
jí přístupnost public):– klíčové slovo public se neuvádí– rozhraní udává, jak s objektem zvenku pracovat
• Jméno implementovaného rozhraní se zapisu-je za jméno třídy oddělené dvojtečkou
• Konvence:– jména rozhraní se zapisují s počátečním velkým
písmenem I
• Poznámka:– od rozhraní nelze vytvořit instanci
23-04-20 63
Rozhraní (4)• Příklad:interface IPoint{
int X { get; set; }int Y { get; set; }void WritePointCoords();
}class MyPoint : IPoint{
public int X { get; set; }public int Y { get; set; }public MyPoint(int x, int y){ X = x; Y = y; }public void WritePointCoords(){ Console.WriteLine
(”[{0}, {1}]”, X, Y);}
}
23-04-20 64
Struktury (1)• Hodnotové typy, které definujeme pomocí
klíčového slova struct• Mohou obsahovat stejné členy jako třídy• Na rozdíl od tříd mají následující omezení,
která vyplývají z podstaty hodnotových typů:– vždy mají výchozí konstruktor (bez parametrů),
který: • nelze předefinovat• nastaví všechny datové položky (členské proměnné):
– hodnotových typů na implicitní (defaultní) hodnotu: • 0, 0.0 pro číselné typy• false pro typ bool• ’\0’ pro typ char
– referenčních typů na hodnotu null
23-04-20 65
Struktury (2)– libovolný jiný konstruktor, který nezabezpečuje
inicializaci (nastavení) všech členských proměn-ných musí volat konstruktor bezparametrický (po-mocí this())poznámka:
• použití this() je nutné i v případě, že konstruktor inicializuje členské proměnné pomocí vlastností
– nelze v době definice inicializovat členské pro-měnné (vyjma statických)
– nemohou dědit, ale mohou implementovat rozhra-ní
Struktury (3)• Příklad:struct Point {
public int X { get; set; }public int Y { get; set; }public Point(int x, int y) : this(){ X = x; Y = y; }
}class Dog{
public Color Color { get; set; }public Dog(Color color){ Color = color; }
}6623-04-20
23-04-20 67
Struktury (4)
[4, 3]
[0, 0]
pt1
pt2
dog1
dog2 N/A
pt1 = new Point(4, 3);pt2 = new Point()dog1 = new Dog(Color.White);
N/A
N/A
pt1
pt2
dog1
dog2
N/A
N/A
Point pt1;Point pt2;Dog dog1;Dog dog2;
23-04-20 68
Struktury (5)
[4, 3]
[9, 1]
pt1
pt2
dog1
dog2
pt2.X = 9;pt2.Y = 1; dog2.Color = Color.Gray;
[4, 3]
[4, 3]
pt1
pt2
dog1
dog2
pt2 = pt1;dog2 = dog1;
23-04-20 69
Jmenný prostor (1)• Jmenný prostor (namespace) představuje po-
jmenovaný kontejner pro další identifikátory (např. třídy)
• Používán k seskupení a k rozlišení identifiká-torů
• Různé jmenné prostory mohou obsahovat stejné identifikátory
• Dva identifikátory se stejným názvem nelze zaměnit, pokud se nacházejí v různých jmen-ných prostorech
23-04-20 70
Jmenný prostor (2)• V rámci jednoho souboru může být defino-
váno více jmenných prostorů
• Více souborů může zahrnovat jeden jmenný prostor
• Jmenné prostory mohou být do sebe vzájemně vnořovány
• Jmenný prostor je možné definovat pomocí klíčového slova namespace
• Každý jmenný prostor má přístup typu public(nelze změnit)
23-04-20 71
Jmenný prostor (3)• Příklad:
public class ClassA{}
namespace NamespaceY{ public class ClassB { }}
public class ClassC{}
namespace NamespaceY{ public class ClassA { }}
namespace NamespaceZ{ public class ClassB { }}
Soubor1.cs Soubor2.cs
23-04-20 72
Jmenný prostor (4)• Je-li identifikátor deklarovaný (definovaný)
bez specifikovaného jmenného prostoru, pak jej automaticky překladač zařadí do globál-ního jmenného prostoru (global namespace)
• Identifikátor lze zpřístupnit pomocí označení jmenného prostoru (jmenných prostorů), např.:System.Console.WriteLine(…);kde:– System – jmenný prostor– Console – třída– WriteLine – metoda
23-04-20 73
Jmenný prostor (5)
• Pomocí klíčového slova using je možné da-ný jmenný prostor zařadit do aktuálního obo-ru platnosti
• Pro zpřístupnění identifikátoru pak není nutné uvádět označení jmenného prostoru
• Příklad:using System;
Console.WriteLine(…);