TOC

This article has been localized into Czech by the community.

Operátory:

Operátor interpolace řetězců

V jiné části tohoto tutoriálu najdete podrobný popis datového typu řetězec, protože práce s textem je velmi důležitá. V tomto článku se zaměříme na speciální operátor pro práci s řetězci, který vám umožní provádět několik dalších triků při deklaraci řetězců. Jmenuje se interpolace řetězců (zavedeno v C# 6.0) a umožní vám vložit do vašeho řetězce speciální značky, které interpret později nahradí příslušnými hodnotami. Funguje podobně jako metoda String.Format(), o které jsme již hovořili, ale syntaxe je čitelnější a pohodlnější.

Řetězcové interpolace lze dosáhnout velmi snadno – stačí před řetězec zadat znak $. Jako vždy přejdeme rovnou k příkladu:

string name = "John Doe";
int age = 42;

Console.WriteLine(name + " is " + age + " years old");
Console.WriteLine($"{name} is {age} years old");

Ve dvou posledních řádcích děláme přesně to samé: nejprve tradičním způsobem, kde konkatenací vytvoříme řetězec pomocí našich dvou proměnných, a pak pomocí interpolace řetězců. Všimněte si, jak nám to umožňuje přímo do řetězce vkládat proměnné tak, že je obklopíme složenými závorkami. A i když se to děje uvnitř řetězce, kompilátor skutečně zkontroluje proměnné, které se snažíte vložit!

Proměnné, které používáte, také nemusí být jednoduché typy - můžete použít vlastnosti z komplexních objektů stejně, jako byste to dělali při běžné konkatenaci řetězců. Zde je příklad:

var user = new
{
    Name = "John Doe",
    Age = 42
};
Console.WriteLine($"{user.Name} is {user.Age} years old");

Formát řetězců

Ve výchozím nastavení budou proměnné, které zahrnete, převedeny na požadovanou řetězcovou reprezentaci voláním metody ToString() na nich. Ale někdy možná budete hledat trochu větší kontrolu nad tím, jak je každá proměnná zobrazena, a naštěstí je to velmi jednoduché díky formátovacím řetězcům. Jednoduše po proměnné vložte dvojtečku (:) a pak zadejte formátovací řetězec, který má být použit, jako v tomto příkladu:

double daysSinceMillenium = (DateTime.Now - new DateTime(2000, 1, 1)).TotalDays;  
Console.WriteLine($"Today is {DateTime.Now:d} and {daysSinceMillenium:N2} days have passed since the last millennium!");

Výsledek bude vypadat nějak takto, v závislosti na nastavení vašeho systému pro data a čísla:

Today is Friday, June 29, 2018 and 6,754.49 days have passed since the last millenium!

Všimněte si, jak je datum reprezentováno ve formátu dlouhého data (jak je specifikováno formátovacím řetězcem "D") a číslo je hezky naformátováno s oddělovači tisíců a dvěma desetinnými čísly, díky numerickému formátovacímu řetězci "N2".

Pokud chcete ještě větší kontrolu, můžete přejít od výchozích formátovacích řetězců k vlastním formátovacím řetězcům, například pro data:

Console.WriteLine($"Today is {DateTime.Now:yyyy-MM-dd}");

Existuje mnoho dalších způsobů formátování DateTime, které můžete použít v interpolovaném řetězci. Pro všechny možnosti se prosím poraďte s dokumentací.

Kromě proměnných

Nyní jsme do našich řetězců zahrnuli proměnné a dokonce i vlastnosti objektů a viděli jsme, jak snadno můžeme formátovat výsledné řetězce. Ale interpolace řetězců jde ještě dál, protože můžete mít uvnitř svých řetězců celé výrazy C#, pokud vedou k něčemu, co lze připojit k řetězci. Skvělým příkladem toho je klasická situace "s koncovkou s nebo bez", kde musíte vytvořit řetězec, který je buď "1 rok" nebo "2 roky". To můžete udělat přímo s interpolací řetězců, jednoduše použitím ternárního operátoru uvnitř řetězce:

string name = "John Doe";
int age = 42;

Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old");

Všimněte si, jak jsem do řetězce vložil jednoduchý if-then-else příkaz, uvnitř závorek. Můžeme to udělat, protože výsledek výrazu je řetězec - buď prázdný, nebo "s". Můžete také provádět matematické operace:

Console.WriteLine($"5 + 5 * 2 = {((5 + 5) * 2)}");

Opět, pokud lze výsledek výrazu převést na řetězec, můžete jej použít ve vašem interpolovaném řetězci.

Interpolace řetězců a escapování

Neuplyne dlouho, než vám při práci s interpolací řetězců vznikne velmi zřejmá otázka: Jak mohu zahrnout znaky, které mají specifický význam, například složené závorky, a nechat je interpretovat doslova? Odpovědí na to je obvykle použitím escape sekvencí (escapování) - činnost předřazení/připojení znaku před/za jiný znak, aby se zrušil jeho speciální účel. To platí i pro interpolaci řetězců, kde by složené závorky měly být napsány dvakrát, pokud chcete, aby byly interpretovány doslova, jako v tomto příkladu:

Console.WriteLine($"Insert {name} between curly braces: {{name here}}");

Výsledek

Insert John Doe between curly braces: {name here}

Shrnutí

Pokud jste kdy považovali klasickou konkatenci – slučování řetězců za příliš neohrabanou, interpolace řetězců se vám bude zamlouvat! Byla zavedena ve verzi C# 6.0 a umožňuje vám psát text, který zahrnuje proměnné velmi přirozeným a snadno čitelným způsobem. Jsou také skvělé, protože vám umožňují přímo do řetězců integrovat výrazy, ale buďte opatrní - v určitém okamžiku může být váš interpolovaný řetězec tak pokročilý, že bude těžší ho číst než alternativy.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!