This article has been localized into Czech by the community.
Řetězec (string)
Řetězec je kus textu. Obvykle se skládá ze dvou nebo více znaků, protože pokud jde jen o jeden, měli byste místo toho zvážit použití char. Nicméně řetězce mohou být také prázdné nebo dokonce null, protože se jedná o referenční typ. Řetězec lze deklarovat podobně jako ostatní datové typy, se kterými jsme již pracovali:
string s;
Nebo pokud mu chcete okamžitě přiřadit hodnotu:
string name = "John Doe";
Cokoli v rámci dvojitých uvozovek v C# je považováno za řetězec, jako v příkladu výše - umístění jednoho nebo několika znaků mezi dvojité uvozovky je jednoduše způsob, jak kompilátoru sdělíte, že věci mezi nimi, by měly být interpretovány jako řetězec, namísto např. klíčových slov a příkazů.
Řetězce jsou neměnné
V C# jsou řetězce neměnné, což v podstatě znamená, že jakmile jsou vytvořeny, nemohou být změněny. To samozřejmě není v každodenním používání moc praktické, takže nám framework pomáhá - namísto nutnosti neustále deklarovat nové řetězce pro provedení změn jednoduše vytvoří za vás nový řetězec pokaždé, když změníte stávající. To z toho dělá bezproblémový proces, ale může také vaši kód učinit méně efektivním, aniž byste si toho všimli. Zde je příklad, který to ilustruje:
string numbers = "";
for (int i = 0; i < 10000; i++)
numbers += i.ToString();
V tomto případě cyklíme 10 000krát, přičemž pokaždé připojíme aktuální index k řetězci. S vědomostmi, které jste právě získali, nyní víte, že místo úpravy stávajícího řetězce tak, aby zahrnoval nejnovější číslo, je vytvořen nový řetězec, který je poté přiřazen ke staré proměnné, zatímco stará hodnota je uklizena frameworkem. A to se stane 10 000krát! Místo toho se obecně doporučuje použít tzv. StringBuilder, pokud víte, že budete řetězec vytvářet přes několik operací:
StringBuilder numbers = new StringBuilder();
for (int i = 0; i < 10000; i++)
numbers.Append(i);
Console.WriteLine(numbers.ToString());
Základní operace s řetězci
S tím vším, co bylo řečeno o neměnnosti řetězců, se budete i tak často setkávat s manipulací a prací s jednoduchými řetězci a nebojte se toho - pokud nepracujete v obrovské smyčce, pravděpodobně to nebude problém! Zde jsou některé ze základních věcí, které můžete dělat s řetězci:
Můžete spojit dva nebo více řetězců jednoduše jejich "sčítáním" (použitím operátoru plus):
string name = "John" + " " + "Doe";
Samozřejmě můžete totéž dělat s proměnnými, kde mísíte řetězce uzavřené v dvojitých uvozovkách s proměnnými, které jsou buď řetězci nebo které mohou být převedeny na řetězce (použitím metody ToString() nalezené na všech objektech). Nicméně "čistší" způsob, jak to udělat, je s metodou Format nalezenou ve třídě String:
string name = "John Doe";
int age = 42;
string userString = String.Format("{0} is {1} years old and lives in {2}", name, age, "New York");
Všimněte si, jak používám číslované zástupné symboly ({0}, {1} atd.) a poté dodávám hodnoty pro ně jako parametry metody. Jen si pamatujte, že indexy a počet zástupných symbolů musí odpovídat parametrům, které předáte!
Vlastnost Length umožňuje zkontrolovat aktuální délku řetězce, např. pro účely validace. Vlastnost Length je také velmi užitečná v kombinaci s dalšími vlastnostmi a metodami, např. metodami Substring() a IndexOf(). Metoda Substring umožňuje získat část řetězce, zatímco metoda IndexOf umožňuje najít první index daného znaku/řetězce. Dovolte mi to ilustrovat na příkladu:
string name = "John Doe";
int indexOfSpace = name.IndexOf(' ') + 1;
string lastName = name.Substring(indexOfSpace, name.Length - indexOfSpace);
Console.WriteLine(lastName);
Rychlé vysvětlení: Definujeme jméno, poté použijeme metodu IndexOf() k nalezení první pozice znaku mezery. Poté použijeme metodu Substring() k získání všeho po znaku mezery tím, že dodáme počáteční pozici i délku.
Další skvělou pomocnou metodou ve třídě String je metoda Replace(). Umožňuje vzít řetězec a provést na něm operaci hledání/nahrazení, jako v tomto případě:
string name = "John Doe";
Console.WriteLine(name.Replace("John", "Jane"));
Metoda Replace() není vůbec striktní - pokud řetězec, který hledáte (první parametr), není přítomen, nestane se nic (nebudou vyvolány žádné výjimky ani nic podobného). Pokud je přítomen, bude nahrazen druhým parametrem. Pokud však chcete před nahrazením zkontrolovat, můžete použít metodu Contains():
string name = "John Doe";
if (name.Contains("John"))
Console.WriteLine(name.Replace("John", "Jane"));
else
Console.WriteLine("John was not found!");
Někdy chcete vědět, zda řetězec začíná nebo končí konkrétním znakem nebo řetězcem. Pro to vám může třída String pomoci s metodami StartsWith() a EndsWith(), které fungují přesně tak, jak název napovídá:
string name = "John Doe";
if ((name.StartsWith("John")) && (name.EndsWith("Doe")))
Console.WriteLine("Hello, Mr. Doe!");
Existuje ještě více skvělých metod třídy String, a určitě existuje více způsobů, jak je používat, než jak je ilustrováno těmito krátkými příklady. Pokud se chcete dozvědět více, podívejte se na dokumentaci MSDN pro třídu String.
Řetězce doslovně & únikové (escape) sekvence
Při definování řetězce brzy zjistíte, že určité znaky mají speciální účely. Nejdůležitějším příkladem toho je samotná dvojitá uvozovka, protože když se používá k označení začátku a konce řetězce pro kompilátor, jak ji můžete použít uvnitř svého řetězce? Nejjednodušší odpověď na toto je únik (escaping), kde dáváte kompilátoru signál, že speciální znak by měl být brán doslova místo jeho obvyklé funkce. Zde je příklad:
Console.WriteLine("What do you mean by \"Hello, world\" ??");
Po spuštění bude výsledek vypadat takto:
What do you mean by "Hello, world" ??
Jinými slovy, jednoduše použijeme zpětná lomítka před dvojitou uvozovkou, abychom naznačili, že toto NENÍ konec řetězce, ale místo toho skutečně chceme dvojitou uvozovku. A co když skutečně chceme zpětné lomítko a nejen jej použít k úniku jiného znaku? Pak budete muset i toto zpětné lomítko escapovat - dalším zpětným lomítkem:
Console.WriteLine("Right here \\ Right now");
Což vede k:
Right here \ Right now
Důvodem je, že zpětné lomítko se nepoužívá pouze k escapování dvojitých uvozovek - používá se také k prefixování řady znaků, aby jim byl přidělen speciální význam. Například \n je nový řádek, \t je tabulátor a tak dále. Hezký seznam únikových sekvencí můžete najít zde.
Řetězce doslovně
Jako alternativu ke všemu tomuto escapování můžete použít doslovný řetězec. Je to jako obvyklá deklarace řetězce, ale s prefixem znaku @, a uvnitř jsou všechny znaky brány doslova:
Console.WriteLine(@"In a verbatim string \ everything is literal: \n & \t");
Výstup bude vypadat přesně jako vstup:
In a verbatim string \ everything is literal: \n & \t
Existuje jen jedna výjimka z tohoto pravidla: Dvojitá uvozovka musí být stále escapována, což dává dobrý smysl, protože jak by jinak kompilátor věděl, zda se snažíte řetězec ukončit nebo ne? V doslovném řetězci se však dvojitá uvozovka neescapuje zpětným lomítkem, ale další dvojitou uvozovkou, jako zde:
Console.WriteLine(@"What do you mean by ""Hello, world"" ??");
Výsledek vypadá takto:
What do you mean by "Hello, world" ??
Shrnutí
Řetězce jsou TAK důležitým tématem pro všechny programátory - pravděpodobně budete provádět nějaké zpracování řetězců po většinu času, který strávíte psaním kódu. Naštěstí má C# všechny nástroje, které k tomu budete potřebovat, jak jsem se pokusil ilustrovat v tomto článku.