220 likes | 399 Views
Indexery ( 1 ). Členy třídy (struktury) umožňující třídě (struk-tuře) používat hranaté závorky a pracovat s ní podobně jako s polem (používat indexy) Definují se „podobně“ jako vlastnosti Název indexeru je vždy this , po němž násle-dují jeho parametry (v hranatých závorkách)
E N D
Indexery (1) • Členy třídy (struktury) umožňující třídě (struk-tuře) používat hranaté závorky a pracovat s ní podobně jako s polem (používat indexy) • Definují se „podobně“ jako vlastnosti • Název indexeru je vždy this, po němž násle-dují jeho parametry (v hranatých závorkách) • Používá přístupové metody: • get: • pro načtení hodnoty na daném indexu (indexech) • set: • pro zápis hodnoty na daném indexu (indexech) • zapisovaná data jsou předávána parametrem value
Indexery (2) • Příklad:publicintthis[int index] { get { … } set{… }} • Poznámka: • pomocí indexerů je možné s třídami a strukturami pracovat i jako s vícerozměrnými poli(přidáním dalšího argumentu do hranatých závorek):public double this[int i, int j]
Metody s proměnným počtem parametrů • Jazyk C# umožňuje definovat metody akcep-tující variabilní počet skutečných parametrů • Pro definici metody s proměnným počtem pa-rametrů se využívá modifikátor params • Modifikátor params může být uvedený pou-ze před posledním parametrem metody • Parametr zapsaný za params musí být vždy typu pole
Řetězce • Řetězec představuje posloupnost znaků, tj. hodnot typu char • Jednotlivé znaky lze zpřístupnit pomocí jejich indexů (zapisovaných v hranatých závorkách) • Narozdíl od jazyka C řetězce nejsou ukonče-ny znakem ’\0’ • Řetězce mohou být v jazyku C#reprezento-vány např.: • datovým typem string (synonymum pro bázo-vou třídu System.String) • třídou StringBuilder (definována ve jmen-ném prostoru System.Text)
Třída String (1) • Definována ve jmenném prostoru System • Slouží pro ukládání řetězců a práci s nimi • Délku řetězce (počet znaků) lze získat pomocí vlastnosti Length • Obsahuje mimo jiné přetížený operátor: • + pro zřetězení (spojení) dvou řetězců • == pro porovnání dvou řetězců na rovnost • Poskytuje také sadu metod, např.: • Compare,CompareOrdinal: • lexikograficky porovnává řetězce se (bez) zohledně-ním (zohlednění) místního jazykového nastavení
Třída String (2) • Format: • nahrazuje formátovací značky ({0}, {1}apod.) v ře-tězci hodnotami dalších parametrů • IndexOf, LastIndexOf: • najde první (poslední) výskyt podřetězce nebo znaku v řetězci • Insert: • vloží (od zadané pozice) podřetězec do řetězce • PadLeft, PadRight: • doplní zleva (zprava) řetězec opakováním daného znaku • Remove: • vymaže část řetězce
Třída String (3) • Replace: • nahradí výskyty daného řetězce zadaným řetězcem nebo znakem • Split: • rozdělí řetězec na podřetězce • k rozdělení dojde v místech nalezení zadaného znaku • Substring: • vrátí podřetězec začínající na zadané pozici v řetězci • ToLower, ToUpper: • převede řetězec na malá (velká) písmena • TrimStart, TrimEnd, Trim: • odstraní ze začátku (konce, začátku i konce) řetězce mezery
Třída String (4) • Poznámky: • řetězec reprezentovaný třídou string je neměn-ný (immutable) metody manipulující s řetěz-cem vytvářejí novou instanci • znaky na dané pozici (indexu) se chovají jako read-only, tj. není možné provést přiřazení (zápis) znaku na zadanou pozici, např zápis.:string s = ”Hello world”;s[1] = ’a’; //nelzezpůsobí chybu
Třída StringBuilder (1) • Definována ve jmenném prostoru System.Text • Při úpravě řetězců reprezentovaných třídou StringBuildernedochází k vytváření nové instance, ale upravuje se stávající obsah • Nová paměť je alokována pouze v případě, že po vykonané operaci řetězec přesahuje speci-fikovanou kapacitu • Vykazuje větší efektivitu při operacích jako jsou např. zřetězení řetězců, náhrada části řetězce, vkládání znaků do řetězce apod.
Třída StringBuilder (2) • Poskytuje např. metody: • Append: • připojení řetězce • Insert: • vložení řetězce • Remove: • odstranění znaků z řetězce • Replace: • nahrazení výskytu znaku nebo podřetězce jiným zna-kem nebo podřetězcem • ToString: • vrací obsah řetězce přetypovaný na string
Třída StringBuilder (3) • Poznámky: • třída StringBuilder definuje také vlastnosti: • Length: • zpřístupňuje aktuální délku řetězce • Capacity: • určuje maximální počet znaků, pro něž je v současné instanci alokované paměťové místo • u instancí třídy StringBuilder lze přiřadit znak na zadaný index (pozici)
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.0pro číselné typy • falsepro typ bool • ’\0’ pro typchar • referenčních typů na hodnotu null
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; }}
Struktury (4) Point pt1;Point pt2; pt1 N/A dog1 N/A Dog dog1; Dog dog2; pt2 N/A dog2 N/A pt1=new Point(4,3); pt2=new Point() dog1=new Dog(Color.White); pt1 [4, 3] dog1 pt2 [0, 0] dog2 N/A
Struktury (5) pt2=pt1; dog2=dog1; pt1 [4, 3] dog1 pt2 [4, 3] dog2 pt2.X=9; pt2.Y=1; dog2.Color = Color.Gray; pt1 [4, 3] dog1 pt2 [9, 1] dog2
Generické typy (1) • Generické typy (generika) umožňují psát prog-ramy, které používají parametrizované typy • Parametrizované typy jsou v době použití na-hrazeny typy konkrétními • Vhodnév případech, kdy se stejný kód opaku-je pro různé datové typy lepší znovupouži-telnost • Zabezpečují silnou typovou kontrolu v době překladu zdrojového kódu
Generické typy (2) • Generický typ (T) se zapisuje za název defino-vaného objektu mezi symboly <, > (<T>) • V rámci jedné definice je možné použít i více parametrizovaných typů (<T1,T2,T3>) • V jazyku C# lze pomocí generik definovat: • třídy • struktury • rozhraní • metody • delegáty
Generické typy (3) • Příklad definice generické metody:static voidSwap<T>(ref T p1, ref T p2) { T temp; temp = p1; p1 = p2; p2 = temp; } • Příklad použití:inta = 10, b = 20; double x = 123.87; y = 15.654;Swap<int>(refa, refb);Swap<double>(ref x, ref y);
Generické typy (4) • Příklad definice generické třídy:class Stack<T> {privateT[] items; privateintcount; public Stack(int n){…}public void Push(T item) {…}publicT Pop() {…}} • Příklad použití:Stack<int> stack= newStack<int>(10); stack.Push(3); intx = stack.Pop();
Generické typy (5) • Na parametrizovaný typ mohou být kladena omezení (zapisována) pomocí klíčového slova where: • where T:struct: • typ T musí být hodnotový typ • where T:class: • typ T musí být referenční typ • může se jednat o třídu, rozhraní, delegáta nebo pole • where T:new(): • typ T musí mít veřejný konstruktor bez parametrů • je-li toto omezení použito v kombinaci s ostatními, pak musí být uvedeno jako poslední
Generické typy (6) • where T:class_name: • typ T musí být odvozen ze specifikované třídy • whereT:interface_name: • typT musí implementovat dané rozhraní • je možné specifikovat několik těchto omezení najednou • Omezení parametrizovaných typů jsou zapiso-vána v záhlaví třídy za jejím názvem • Příklad:classMyClass<T, U>where T : class, IComparablewhere U : struct{ … }