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[ ]
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.
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.
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.
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.