1 / 22

Indexery ( 1 )

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)

barto
Download Presentation

Indexery ( 1 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

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

  3. 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

  4. Ř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)

  5. 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í

  6. 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

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

  8. 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

  9. 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.

  10. 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

  11. 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)

  12. 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

  13. 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í

  14. 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; }}

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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);

  20. 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();

  21. 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í

  22. 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{ … }

More Related