SlideShare a Scribd company logo
1 of 51
Download to read offline
Programování v .NET a C#
Přednáška 02
Přednáší
Ing. Jan Hřídel
jan.hridel@upce.cz
www.hridel.com
V pochvalných i kritických tweetech z přednášky nezapomeňte
zmínit @h0nza.
Referenční datové typy
Pole
Pole
Společné prvky polí v C# a C++
● Indexují se od nuly.
Pole
Rozdílnosti polí v C# oproti C++
● Jsou dynamicky alokována (operátor new).
● Dealokaci provádí automatická správa paměti.
● Pracuje se s nimi pomocí referencí.
● S polem lze pracovat jako s celkem.
● Před každým přístupem k prvku se kontroluje, zda daný index leží v rozsahu
daném deklarací. Jinak se vyvolá výjimka System.IndexOutOfRange.
Pole
● Instance tříd odvozených od System.Array.
● Lze je použít v cyklu foreach – třída System.Array totiž implementuje
IEnumerable.
● Syntaxe specifikace jednorozměrného pole: typ_nepole[ ]
Pole
Syntaxe deklarace
● typ_jednorozměrného_pole identifikátor = new typ_nepole [ počet_prvkůnep
]
inicializátor_polenep
● typ_jednorozměrného_pole identifikátor = inicializátor_pole
Pole
Příklady deklarace
● int[] pole = new int[10];
● int[] pole = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
● int[] pole = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
● pole = new int[5];
Pole
Příklady chybné deklarace
● int[] xpole = new int[3] {0, 1};
● int n = 4;
int[] xpole = new int[n] {0, 1, 2, 3};
Pole
Inicializace nového pole mimo deklaraci
● pole = new int[] {0, 1};
● pole = {0, 1, 2};
Pole
velikost
● vlastnost Length
static void VypisPole(int[] pole) {
for (int i = 0; i < pole.Length; i++)
Console.Write(pole[i] + " ");
}
Pole
Zkopírování obsahu jednoho pole do druhého pole stejného typu
● metoda CopyTo()
int[] pole2 = new int[15];
pole.CopyTo(pole2, 3);
Nakopíruje všechny prvky z pole do pole2. Zkopírované prvky budou začínat od indexu 3.
Nové pole musí být dostatečně velké, jinak se vyvolá výjimka
System.ArgumentException .
Pole
Další statické metody třídy System.Array
● ConstrainedCopy - Zkopíruje zadaný počet prvků jednoho pole od zadaného indexu do jiného pole
od zadaného indexu.
● Find - Vrací hodnotu prvního prvku, pro nějž je pravdivý zadaný predikát.
● FindLast - Vrací hodnotu posledního prvku, pro nějž je pravdivý zadaný predikát.
● FindIndex - Vrací index prvního prvku, pro nějž je pravdivý zadaný predikát.
● FindLastIndex - Vrací index posledního prvku, pro nějž je pravdivý zadaný predikát.
● Resize - Zvětší nebo zmenší velikost pole. Do nově alokovaného pole zkopíruje prvky původního
pole.
Vícerozměrná pole
Pole
Syntaxe specifikace vícerozměrného pole.
typ_nepole [ oddělovače_dimenzí ]
oddělovače_dimenzí - Jedna nebo více čárek. Pro n rozměrné pole se uvádí n-1
čárek.
Pole
Příklady deklarací vícerozměrných polí
● int[,] matice = new int[2, 3];
● int n = 2;
int[,,] matice3D = new int[2, 3, n*2];
Pole
Příklady deklarací vícerozměrných polí
● int[,] matice2 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } };
● int[,] matice2 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };
Pole
Přístup k prvku matice na řádku i ve sloupci j
matice[i, j]
Nelze použít zápis z C++
matice[i][j]
Pole
Vlastnosti a metody třídy System.Array pro vícerozměrná pole:
● Vlastnost Rank - Počet dimenzí pole.
● Vlastnost Length - Celkový počet prvků pole. Pro pole 2x3 má hodnotu 6.
● Metoda GetLength - Vrací počet prvků v zadané dimenzi pole.
Pole
static void VypisMatici(int[,] matice) {
for (int i = 0; i < matice.GetLength(0); i++) {
for (int j = 0; j < matice.GetLength(1); j++) {
Console.Write("{0,5}", matice[i,j]);
}
Console.WriteLine();
}
}
Pole
Jagged arrays - příklady
● int[][] neprPole = new int[2][];
neprPole[0] = new int[2] { 0, 1 };
neprPole[1] = new int[3] { 2, 3, 4 };
● int[][,] smisenePole;
Nepravidelné pole složené z pravidelných polích.
Delegáty
Delegáty
~ objektově zapouzdřené
ukazatele na metodu
Delegáty mohou obsahovat
● Adresu statické metody.
● Adresu nestatické metody spolu s adresou konkrétní instance.
Volání takové metody je podobné jako volání metody pomocí ukazatele v C++.
Delegáty - deklarace
modifikátornep
delegate typ jméno (seznam_parametrůnep
);
● modifikátor - Přístupová práva.
● typ - Návratové hodnoty metody, na níž budou delegáty tohoto typu ukazovat.
● jméno - Identifikátor, doporučuje se přípona Callback, nedoporučuje se přípona Delegate.
● seznam_parametrů - Seznam parametrů metody, na níž budou delegáty ukazovat. Jména
parametrů delegátu mohou být odlišná od jmen parametrů metody, na níž delegát ukazuje.
Delegáty - příklad
viz: https://drive.google.com/file/d/0B9PkcEfMNWOZd2RSZExaUkFJc2c/view?usp=sharing
Delegáty - kovariance a kontra-variance
Parametrem metody, na kterou instance
delegátu ukazuje, může být předek parametru
delegátu.
Návratovým typem metody, na kterou instance
delegátu ukazuje, může být potomek
návratového typu delegátu.
Předek a potomek musí být referenčního typu.
Delegát - anonymní metody
Blok příkazu přiřazený přímo instanci delegátu
delegate signatura_anonymní_metodynep
blok
● Seznam formálních parametrů anonym. metody v kulatých závorkách. Lze jej
vynechat, pokud nejsou parametry použity nebo se jedná o bezparametrový
delegát.
● Blok - Složený příkaz. Může obsahovat vnější proměnné (lokální proměnné
metody, v níž je anonymní metoda deklarována).
Delegát - anonymní metody - příklad
Viz: https://drive.google.com/file/d/0B9PkcEfMNWOZdnBwQ1hGSzVaNUk/view?
usp=sharing
Delegát
Odvozeny od třídy System.MulticastDelegate
Volání metody prostřednictvím delegátu je synchronní. Asynchronní volání lze
provést pomocí metod BeginInvoke a EndInvoke.
Vícenásobné delegáty
Vícenásobné delegáty
Ukazují na metody vracející void.
Jedna instance může obsahovat ukazatele na více metod.
Nové metody do delegátu lze přidat (operátor +=) i je z něho odebrat (operátor -=).
Při volání se zavolají všechny metody, na něž delegát ukazuje.
● V pořadí, v jakém byly do něho přidány.
● Jedna metoda může být obsažena vícekrát.
Vícenásobné delegáty - příklad
Viz: https://drive.google.com/file/d/0B9PkcEfMNWOZcU96MThjV2lWcU0/view?usp=sharing
Vícenásobné delegáty - trochu zvláštní
referenční typ
Operátorem přiřazení se sice tvoří kopie reference (stejně jako u třídy), ale jeho pozdější modifikací
(přidání či odebrání metody) prostřednictvím jedné reference se ta druhá bude odkazovat stále na
původní delegát.
Vícenásobné delegáty - trochu zvláštní
referenční typ - příklad
Stejný jako minulý s rozdílem ve funkci Main:
https://drive.google.com/file/d/0B9PkcEfMNWOZMWJoVXdqZ3VXczA/view?usp=sharing
Rozhraní
Rozhraní
Obsahuje pouze seznam metod, indexerů, vlastností a metod bez jejich definice
(těla).
Třída implementující rozhraní musí definovat všechny jeho složky.
Více viz přednáška o rozhraních.
Vybrané systémové třídy
Třída object
Synonymem pro System.Object – společný předek pro všechny datové typy (hodnotové i referenční)
Kromě bezparametrického konstruktoru disponuje metodami:
● bool Equals(object obj)
○ virtuální metoda vracející true, pokud instance this je rovna instanci obj
● bool Equals(object objA, object objB)
○ statická metoda vracející true, pokud instance objA je rovna instanci objB
● int GetHashCode()
○ virtuální metoda vracející hešovací kód instance – pro ukládání instance do hašovací tabulky
(System.Collections.Hashtable )
Třída object
● Type GetType()
○ Dává informaci o skutečném typu instance (vrací instanci třídy Type).
● bool ReferenceEquals(object objA, object objB)
○ Statická metoda, vrací true, pokud objA a objB se odkazují na stejnou instanci.
● string ToString()
○ Virtuální metoda vracející řetězec znaků charakterizující instanci.
● void Finalize()
○ Virtuální chráněná metoda, kterou volá automatická správa paměti těsně před dealokací
instance.
● Object MemberwiseClone()
○ Chráněná metoda. Vrací mělkou kopii (Shallow Copy) instance.
Pracuje se skutečným typem instance.
Třída object
Odkazy (reference) na třídu object lze v C# použít podobně jako ukazatel typu void* v C++.
Proměnné typu object lze přiřadit hodnotu představující odkaz na instanci jakékoli třídy (viz dále –
„zabalení“).
Potřebujeme-li pracovat s instancí, na kterou odkazuje proměnná typu „reference na object“, musí se
přetypovat. Program kontroluje, zda přetypování dává smysl. Pokud ne, vyvolá výjimku System.
InvalidCastException .
Třída string
Pro práci s řetězci.
Synonymum pro třídu System.String
Př.: string s = “Mladá Boleslav”;
Konstanta “Mladá Boleslav” je též instance třídy string. Ne pole znaků jako v C++.
Lze např. použít
int n = “Mladá Boleslav”.Length;
Třída string
Vybrané veřejné složky
● string(char[] s)
○ Konstruktor, který vytvoří řetězec z pole znaků.
● string(char c, int n)
○ Konstruktor, který vytvoří řetězec z n znaků c.
● Empty
○ Statická datová složka. Prázdný řetězec.
● Length
○ Vlastnost. Počet znaků řetězce.
Třída string
● Compare
○ Statické metody. Porovnává dva řetězce podle aktuální (či zadané) kultury, s ohledem či bez
ohledu na velikost písmen aj.
● Concat
○ Statické metody. Spojení několika řetězců, či jiných objektů, u kterých se nejprve volá
ToString().
● EndsWith
○ Metody. Vrací true, když řetězec končí zadaným řetězcem.
Třída string
● int IndexOf(char c)
○ Metoda vracející index prvního výskytu znaku c.
● string Insert(int idx, string s)
○ Vrací nový řetězec, který vznikne vložením řetězce s na pozici idx řetězce this. Ten se
nemění.
● string Remove(int idx, int n)
○ Vrací nový řetězec, který vznikne odstraněním n znaků z pozice idx řetězce this. Ten se
nemění.
Třída string
● StartWith
○ Metody vracející true, pokud řetězec začíná zadaným řetězcem.
● ToLower, ToUpper
○ Vrací nový řetězec, který vznikne převedením velikosti písmen řetězce this. Ten se nemění.
● string Trim
○ Vrací nový řetězec, který vznikne odstraněním bílých nebo zadaných znaků z počátku a konce
řetězce this. Ten se nemění.
Třída string
● bool Equals(object obj)
○ Metoda vracející true, pokud řetězec obj je shodný s řetězcem this.
○ Výsledek, resp. jeho negaci, této metody vrací též operátory == resp. !=
● + a +=
○ Operátory pro spojování řetězců.
● []
○ Operátory indexování pro přístup (jen pro čtení) ke znaku na zadané pozici.
Třída string
Řetězcový literál (konstanta) se zapisuje do uvozovek.
Př.
string s1 = "Řetězec s1, který bude vypsánnna více řádků.";
string s2 = "První část řetězce s2. " +
"Druhá část řetězce s2.";
string s3 = @"Doslovné řetězcové konstanty
mají před uvozovkama znak @.
Neimpretují se řídící n posloupnosti.";
Console.WriteLine("{0}nn{1}nn{2}", s1, s2, s3);
Třída string / StringBuilder
Řetězec v instanci string nelze měnit!
Pro úpravy slouží třída System.Text.StringBuilder
Metody Append, Remove, Replace, indexer [] a další.
Alokuje větší pole znaků než řetězec potřebuje. Kapacitu lze získat nebo nastavit skrze vlastnost
Capacity.
Thanks!
Ing. Jan Hřídel
@h0nza
jan.hridel@upce.cz
www.hridel.com

More Related Content

What's hot

Java – Annotations
Java – AnnotationsJava – Annotations
Java – AnnotationsMartin Majlis
 
Tv 08
Tv 08Tv 08
Tv 08352
 
Tv 10 11
Tv 10 11Tv 10 11
Tv 10 11352
 
Tv 09
Tv 09Tv 09
Tv 09352
 
Zend_Db_Statement a Zend_Db_Profiler
Zend_Db_Statement a Zend_Db_ProfilerZend_Db_Statement a Zend_Db_Profiler
Zend_Db_Statement a Zend_Db_ProfilerOndrej Flidr
 
Tv 07
Tv 07Tv 07
Tv 07352
 
Zend_Db a Zend_Db_Adapter
Zend_Db a Zend_Db_AdapterZend_Db a Zend_Db_Adapter
Zend_Db a Zend_Db_AdapterOndrej Flidr
 
Seminar Nastroje Jednotk Testovani
Seminar Nastroje Jednotk TestovaniSeminar Nastroje Jednotk Testovani
Seminar Nastroje Jednotk TestovaniJakub Holy
 
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015angular-cz
 
Tv 03 2011
Tv 03 2011Tv 03 2011
Tv 03 2011352
 

What's hot (10)

Java – Annotations
Java – AnnotationsJava – Annotations
Java – Annotations
 
Tv 08
Tv 08Tv 08
Tv 08
 
Tv 10 11
Tv 10 11Tv 10 11
Tv 10 11
 
Tv 09
Tv 09Tv 09
Tv 09
 
Zend_Db_Statement a Zend_Db_Profiler
Zend_Db_Statement a Zend_Db_ProfilerZend_Db_Statement a Zend_Db_Profiler
Zend_Db_Statement a Zend_Db_Profiler
 
Tv 07
Tv 07Tv 07
Tv 07
 
Zend_Db a Zend_Db_Adapter
Zend_Db a Zend_Db_AdapterZend_Db a Zend_Db_Adapter
Zend_Db a Zend_Db_Adapter
 
Seminar Nastroje Jednotk Testovani
Seminar Nastroje Jednotk TestovaniSeminar Nastroje Jednotk Testovani
Seminar Nastroje Jednotk Testovani
 
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
 
Tv 03 2011
Tv 03 2011Tv 03 2011
Tv 03 2011
 

Similar to KST/ICSHP - 2. přednáška

INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace Jan Hřídel
 
Grafy, zobrazení, vzorce
Grafy, zobrazení, vzorceGrafy, zobrazení, vzorce
Grafy, zobrazení, vzorce352
 
Talend Open Studio DQ
Talend Open Studio DQTalend Open Studio DQ
Talend Open Studio DQdpejcoch
 
Databazove systemy2
Databazove systemy2Databazove systemy2
Databazove systemy2olc_user
 

Similar to KST/ICSHP - 2. přednáška (6)

MergadoFest 19 - Reguláry bez obav
MergadoFest 19 - Reguláry bez obavMergadoFest 19 - Reguláry bez obav
MergadoFest 19 - Reguláry bez obav
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace
 
Grafy, zobrazení, vzorce
Grafy, zobrazení, vzorceGrafy, zobrazení, vzorce
Grafy, zobrazení, vzorce
 
Talend Open Studio DQ
Talend Open Studio DQTalend Open Studio DQ
Talend Open Studio DQ
 
PZ2021
PZ2021PZ2021
PZ2021
 
Databazove systemy2
Databazove systemy2Databazove systemy2
Databazove systemy2
 

More from Jan Hřídel

More from Jan Hřídel (9)

C# - Vícevláknové aplikace
C# - Vícevláknové aplikaceC# - Vícevláknové aplikace
C# - Vícevláknové aplikace
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
INPTP wpf
INPTP   wpfINPTP   wpf
INPTP wpf
 
Aplikační nastavení v .NET
Aplikační nastavení v .NETAplikační nastavení v .NET
Aplikační nastavení v .NET
 
ADO.NET
ADO.NETADO.NET
ADO.NET
 
INPTP přednáška 01a 2016
INPTP přednáška 01a 2016INPTP přednáška 01a 2016
INPTP přednáška 01a 2016
 
Startup investor pitch
Startup investor pitchStartup investor pitch
Startup investor pitch
 
Nástěnka 01
Nástěnka 01Nástěnka 01
Nástěnka 01
 
Nástěnka 02
Nástěnka 02Nástěnka 02
Nástěnka 02
 

Recently uploaded

Project Restart 2024: Lenka Auerová - Budování holistické organizace
Project Restart 2024: Lenka Auerová - Budování holistické organizaceProject Restart 2024: Lenka Auerová - Budování holistické organizace
Project Restart 2024: Lenka Auerová - Budování holistické organizaceTaste
 
Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...
Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...
Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...Taste
 
ZWT - co byste měli vědět - studijní program KIZI VŠE
ZWT - co byste měli vědět - studijní program KIZI VŠEZWT - co byste měli vědět - studijní program KIZI VŠE
ZWT - co byste měli vědět - studijní program KIZI VŠEStanislav Vojíř
 
Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...
Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...
Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...Taste
 
Project Restart 2024: Karel Smutný - Specializace patří do 19. století
Project Restart 2024: Karel Smutný - Specializace patří do 19. stoletíProject Restart 2024: Karel Smutný - Specializace patří do 19. století
Project Restart 2024: Karel Smutný - Specializace patří do 19. stoletíTaste
 
Vybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠE
Vybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠEVybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠE
Vybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠEStanislav Vojíř
 
Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?
Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?
Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?Taste
 
Project Restart 2024: Jiří Langr - Mytologie projektů
Project Restart 2024: Jiří Langr - Mytologie projektůProject Restart 2024: Jiří Langr - Mytologie projektů
Project Restart 2024: Jiří Langr - Mytologie projektůTaste
 
E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...
E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...
E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...Taste
 
Project Restart 2024: Pavel Minář - Procesy pro lepší projekty
Project Restart 2024: Pavel Minář - Procesy pro lepší projektyProject Restart 2024: Pavel Minář - Procesy pro lepší projekty
Project Restart 2024: Pavel Minář - Procesy pro lepší projektyTaste
 

Recently uploaded (10)

Project Restart 2024: Lenka Auerová - Budování holistické organizace
Project Restart 2024: Lenka Auerová - Budování holistické organizaceProject Restart 2024: Lenka Auerová - Budování holistické organizace
Project Restart 2024: Lenka Auerová - Budování holistické organizace
 
Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...
Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...
Project Restart 2024: Martin Vasquez - Inteligence je schopnost reagovat na z...
 
ZWT - co byste měli vědět - studijní program KIZI VŠE
ZWT - co byste měli vědět - studijní program KIZI VŠEZWT - co byste měli vědět - studijní program KIZI VŠE
ZWT - co byste měli vědět - studijní program KIZI VŠE
 
Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...
Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...
Project Restart 2024: Hana Březinová - Psychologické tipy pro práci s lidmi n...
 
Project Restart 2024: Karel Smutný - Specializace patří do 19. století
Project Restart 2024: Karel Smutný - Specializace patří do 19. stoletíProject Restart 2024: Karel Smutný - Specializace patří do 19. století
Project Restart 2024: Karel Smutný - Specializace patří do 19. století
 
Vybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠE
Vybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠEVybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠE
Vybrané předměty vyučované KIZI pro studenty informatických oborů FIS VŠE
 
Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?
Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?
Project Restart 2024: Jan Řezáč - Nahradí AI projektové manažery?
 
Project Restart 2024: Jiří Langr - Mytologie projektů
Project Restart 2024: Jiří Langr - Mytologie projektůProject Restart 2024: Jiří Langr - Mytologie projektů
Project Restart 2024: Jiří Langr - Mytologie projektů
 
E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...
E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...
E-mail Date #2: Jan Krčmář - Retence a RFM: jak pomocí e-mailingu navýšit hod...
 
Project Restart 2024: Pavel Minář - Procesy pro lepší projekty
Project Restart 2024: Pavel Minář - Procesy pro lepší projektyProject Restart 2024: Pavel Minář - Procesy pro lepší projekty
Project Restart 2024: Pavel Minář - Procesy pro lepší projekty
 

KST/ICSHP - 2. přednáška

  • 1. Programování v .NET a C# Přednáška 02
  • 2. Přednáší Ing. Jan Hřídel jan.hridel@upce.cz www.hridel.com V pochvalných i kritických tweetech z přednášky nezapomeňte zmínit @h0nza.
  • 5. Pole Společné prvky polí v C# a C++ ● Indexují se od nuly.
  • 6. Pole Rozdílnosti polí v C# oproti C++ ● Jsou dynamicky alokována (operátor new). ● Dealokaci provádí automatická správa paměti. ● Pracuje se s nimi pomocí referencí. ● S polem lze pracovat jako s celkem. ● Před každým přístupem k prvku se kontroluje, zda daný index leží v rozsahu daném deklarací. Jinak se vyvolá výjimka System.IndexOutOfRange.
  • 7. Pole ● Instance tříd odvozených od System.Array. ● Lze je použít v cyklu foreach – třída System.Array totiž implementuje IEnumerable. ● Syntaxe specifikace jednorozměrného pole: typ_nepole[ ]
  • 8. Pole Syntaxe deklarace ● typ_jednorozměrného_pole identifikátor = new typ_nepole [ počet_prvkůnep ] inicializátor_polenep ● typ_jednorozměrného_pole identifikátor = inicializátor_pole
  • 9. Pole Příklady deklarace ● int[] pole = new int[10]; ● int[] pole = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ● int[] pole = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ● pole = new int[5];
  • 10. Pole Příklady chybné deklarace ● int[] xpole = new int[3] {0, 1}; ● int n = 4; int[] xpole = new int[n] {0, 1, 2, 3};
  • 11. Pole Inicializace nového pole mimo deklaraci ● pole = new int[] {0, 1}; ● pole = {0, 1, 2};
  • 12. Pole velikost ● vlastnost Length static void VypisPole(int[] pole) { for (int i = 0; i < pole.Length; i++) Console.Write(pole[i] + " "); }
  • 13. Pole Zkopírování obsahu jednoho pole do druhého pole stejného typu ● metoda CopyTo() int[] pole2 = new int[15]; pole.CopyTo(pole2, 3); Nakopíruje všechny prvky z pole do pole2. Zkopírované prvky budou začínat od indexu 3. Nové pole musí být dostatečně velké, jinak se vyvolá výjimka System.ArgumentException .
  • 14. Pole Další statické metody třídy System.Array ● ConstrainedCopy - Zkopíruje zadaný počet prvků jednoho pole od zadaného indexu do jiného pole od zadaného indexu. ● Find - Vrací hodnotu prvního prvku, pro nějž je pravdivý zadaný predikát. ● FindLast - Vrací hodnotu posledního prvku, pro nějž je pravdivý zadaný predikát. ● FindIndex - Vrací index prvního prvku, pro nějž je pravdivý zadaný predikát. ● FindLastIndex - Vrací index posledního prvku, pro nějž je pravdivý zadaný predikát. ● Resize - Zvětší nebo zmenší velikost pole. Do nově alokovaného pole zkopíruje prvky původního pole.
  • 16. Pole Syntaxe specifikace vícerozměrného pole. typ_nepole [ oddělovače_dimenzí ] oddělovače_dimenzí - Jedna nebo více čárek. Pro n rozměrné pole se uvádí n-1 čárek.
  • 17. Pole Příklady deklarací vícerozměrných polí ● int[,] matice = new int[2, 3]; ● int n = 2; int[,,] matice3D = new int[2, 3, n*2];
  • 18. Pole Příklady deklarací vícerozměrných polí ● int[,] matice2 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } }; ● int[,] matice2 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };
  • 19. Pole Přístup k prvku matice na řádku i ve sloupci j matice[i, j] Nelze použít zápis z C++ matice[i][j]
  • 20. Pole Vlastnosti a metody třídy System.Array pro vícerozměrná pole: ● Vlastnost Rank - Počet dimenzí pole. ● Vlastnost Length - Celkový počet prvků pole. Pro pole 2x3 má hodnotu 6. ● Metoda GetLength - Vrací počet prvků v zadané dimenzi pole.
  • 21. Pole static void VypisMatici(int[,] matice) { for (int i = 0; i < matice.GetLength(0); i++) { for (int j = 0; j < matice.GetLength(1); j++) { Console.Write("{0,5}", matice[i,j]); } Console.WriteLine(); } }
  • 22. Pole Jagged arrays - příklady ● int[][] neprPole = new int[2][]; neprPole[0] = new int[2] { 0, 1 }; neprPole[1] = new int[3] { 2, 3, 4 }; ● int[][,] smisenePole; Nepravidelné pole složené z pravidelných polích.
  • 25. Delegáty mohou obsahovat ● Adresu statické metody. ● Adresu nestatické metody spolu s adresou konkrétní instance. Volání takové metody je podobné jako volání metody pomocí ukazatele v C++.
  • 26. Delegáty - deklarace modifikátornep delegate typ jméno (seznam_parametrůnep ); ● modifikátor - Přístupová práva. ● typ - Návratové hodnoty metody, na níž budou delegáty tohoto typu ukazovat. ● jméno - Identifikátor, doporučuje se přípona Callback, nedoporučuje se přípona Delegate. ● seznam_parametrů - Seznam parametrů metody, na níž budou delegáty ukazovat. Jména parametrů delegátu mohou být odlišná od jmen parametrů metody, na níž delegát ukazuje.
  • 27. Delegáty - příklad viz: https://drive.google.com/file/d/0B9PkcEfMNWOZd2RSZExaUkFJc2c/view?usp=sharing
  • 28. Delegáty - kovariance a kontra-variance Parametrem metody, na kterou instance delegátu ukazuje, může být předek parametru delegátu. Návratovým typem metody, na kterou instance delegátu ukazuje, může být potomek návratového typu delegátu. Předek a potomek musí být referenčního typu.
  • 29. Delegát - anonymní metody Blok příkazu přiřazený přímo instanci delegátu delegate signatura_anonymní_metodynep blok ● Seznam formálních parametrů anonym. metody v kulatých závorkách. Lze jej vynechat, pokud nejsou parametry použity nebo se jedná o bezparametrový delegát. ● Blok - Složený příkaz. Může obsahovat vnější proměnné (lokální proměnné metody, v níž je anonymní metoda deklarována).
  • 30. Delegát - anonymní metody - příklad Viz: https://drive.google.com/file/d/0B9PkcEfMNWOZdnBwQ1hGSzVaNUk/view? usp=sharing
  • 31. Delegát Odvozeny od třídy System.MulticastDelegate Volání metody prostřednictvím delegátu je synchronní. Asynchronní volání lze provést pomocí metod BeginInvoke a EndInvoke.
  • 33. Vícenásobné delegáty Ukazují na metody vracející void. Jedna instance může obsahovat ukazatele na více metod. Nové metody do delegátu lze přidat (operátor +=) i je z něho odebrat (operátor -=). Při volání se zavolají všechny metody, na něž delegát ukazuje. ● V pořadí, v jakém byly do něho přidány. ● Jedna metoda může být obsažena vícekrát.
  • 34. Vícenásobné delegáty - příklad Viz: https://drive.google.com/file/d/0B9PkcEfMNWOZcU96MThjV2lWcU0/view?usp=sharing
  • 35. Vícenásobné delegáty - trochu zvláštní referenční typ Operátorem přiřazení se sice tvoří kopie reference (stejně jako u třídy), ale jeho pozdější modifikací (přidání či odebrání metody) prostřednictvím jedné reference se ta druhá bude odkazovat stále na původní delegát.
  • 36. Vícenásobné delegáty - trochu zvláštní referenční typ - příklad Stejný jako minulý s rozdílem ve funkci Main: https://drive.google.com/file/d/0B9PkcEfMNWOZMWJoVXdqZ3VXczA/view?usp=sharing
  • 38. Rozhraní Obsahuje pouze seznam metod, indexerů, vlastností a metod bez jejich definice (těla). Třída implementující rozhraní musí definovat všechny jeho složky. Více viz přednáška o rozhraních.
  • 40. Třída object Synonymem pro System.Object – společný předek pro všechny datové typy (hodnotové i referenční) Kromě bezparametrického konstruktoru disponuje metodami: ● bool Equals(object obj) ○ virtuální metoda vracející true, pokud instance this je rovna instanci obj ● bool Equals(object objA, object objB) ○ statická metoda vracející true, pokud instance objA je rovna instanci objB ● int GetHashCode() ○ virtuální metoda vracející hešovací kód instance – pro ukládání instance do hašovací tabulky (System.Collections.Hashtable )
  • 41. Třída object ● Type GetType() ○ Dává informaci o skutečném typu instance (vrací instanci třídy Type). ● bool ReferenceEquals(object objA, object objB) ○ Statická metoda, vrací true, pokud objA a objB se odkazují na stejnou instanci. ● string ToString() ○ Virtuální metoda vracející řetězec znaků charakterizující instanci. ● void Finalize() ○ Virtuální chráněná metoda, kterou volá automatická správa paměti těsně před dealokací instance. ● Object MemberwiseClone() ○ Chráněná metoda. Vrací mělkou kopii (Shallow Copy) instance. Pracuje se skutečným typem instance.
  • 42. Třída object Odkazy (reference) na třídu object lze v C# použít podobně jako ukazatel typu void* v C++. Proměnné typu object lze přiřadit hodnotu představující odkaz na instanci jakékoli třídy (viz dále – „zabalení“). Potřebujeme-li pracovat s instancí, na kterou odkazuje proměnná typu „reference na object“, musí se přetypovat. Program kontroluje, zda přetypování dává smysl. Pokud ne, vyvolá výjimku System. InvalidCastException .
  • 43. Třída string Pro práci s řetězci. Synonymum pro třídu System.String Př.: string s = “Mladá Boleslav”; Konstanta “Mladá Boleslav” je též instance třídy string. Ne pole znaků jako v C++. Lze např. použít int n = “Mladá Boleslav”.Length;
  • 44. Třída string Vybrané veřejné složky ● string(char[] s) ○ Konstruktor, který vytvoří řetězec z pole znaků. ● string(char c, int n) ○ Konstruktor, který vytvoří řetězec z n znaků c. ● Empty ○ Statická datová složka. Prázdný řetězec. ● Length ○ Vlastnost. Počet znaků řetězce.
  • 45. Třída string ● Compare ○ Statické metody. Porovnává dva řetězce podle aktuální (či zadané) kultury, s ohledem či bez ohledu na velikost písmen aj. ● Concat ○ Statické metody. Spojení několika řetězců, či jiných objektů, u kterých se nejprve volá ToString(). ● EndsWith ○ Metody. Vrací true, když řetězec končí zadaným řetězcem.
  • 46. Třída string ● int IndexOf(char c) ○ Metoda vracející index prvního výskytu znaku c. ● string Insert(int idx, string s) ○ Vrací nový řetězec, který vznikne vložením řetězce s na pozici idx řetězce this. Ten se nemění. ● string Remove(int idx, int n) ○ Vrací nový řetězec, který vznikne odstraněním n znaků z pozice idx řetězce this. Ten se nemění.
  • 47. Třída string ● StartWith ○ Metody vracející true, pokud řetězec začíná zadaným řetězcem. ● ToLower, ToUpper ○ Vrací nový řetězec, který vznikne převedením velikosti písmen řetězce this. Ten se nemění. ● string Trim ○ Vrací nový řetězec, který vznikne odstraněním bílých nebo zadaných znaků z počátku a konce řetězce this. Ten se nemění.
  • 48. Třída string ● bool Equals(object obj) ○ Metoda vracející true, pokud řetězec obj je shodný s řetězcem this. ○ Výsledek, resp. jeho negaci, této metody vrací též operátory == resp. != ● + a += ○ Operátory pro spojování řetězců. ● [] ○ Operátory indexování pro přístup (jen pro čtení) ke znaku na zadané pozici.
  • 49. Třída string Řetězcový literál (konstanta) se zapisuje do uvozovek. Př. string s1 = "Řetězec s1, který bude vypsánnna více řádků."; string s2 = "První část řetězce s2. " + "Druhá část řetězce s2."; string s3 = @"Doslovné řetězcové konstanty mají před uvozovkama znak @. Neimpretují se řídící n posloupnosti."; Console.WriteLine("{0}nn{1}nn{2}", s1, s2, s3);
  • 50. Třída string / StringBuilder Řetězec v instanci string nelze měnit! Pro úpravy slouží třída System.Text.StringBuilder Metody Append, Remove, Replace, indexer [] a další. Alokuje větší pole znaků než řetězec potřebuje. Kapacitu lze získat nebo nastavit skrze vlastnost Capacity.