Řetězec je:

  • Datový typ umožňující pracovat s posloupnostmi znaků
  • Řetězce je možné vložit přímo do paměti programu skrze řetězcový literál, který je uvozen a je ukončen uvozovkami
    • Např.: "Toto je řetězec"
  • Reprezentován polem znaků char[]
  • Tento datový typ částečně napodobuje sémantiku hodnotových datových typů, nicméně se jedná o referenční datový typ
string s1 = "Můj text.";
string s2 = s1; // Alokace nové paměti a zkopírování hodnoty s1 do s2
  • Řetězce jsou immutable – není možné provádět změnu jednotlivých znaků.
string s1 = "Yes";
s1[0] = 'P'; // Toto není možné

Statické metody nad řetězci

C# nabízí sadu vestavěných metod, které usnadňují práci s řetězci.

Například:

  • Split() – Rozdělí řetězec podle zadaného znaku.
  • Remove() – Odstraní část řetězce podle indexu.
  • StartsWith() – Vrátí true, pokud řetězec začíná zadaným textem.
  • EndsWith() – Vrátí true, pokud řetězec končí zadaným textem.
  • ToLower() – Převede celý řetězec na malá písmena.
  • ToUpper() – Převede celý řetězec na velká písmena.
  • Replace() – Nahradí část textu jiným.
  • a další…
string text = "Hello,World!";
 
// Split
string[] parts = text.Split(','); // parts: ["Hello", "World!"]
 
// Remove(5) - odstraní od indexu 5 dál
string removed = text.Remove(5); // removed: "Hello"
 
// StartsWith / EndsWith
bool starts = text.StartsWith("Hello"); // starts: true
bool ends = text.EndsWith("!"); // ends: true
 
// ToLower / ToUpper
string lower = text.ToLower(); // lower: "hello,world!"
string upper = text.ToUpper(); // upper: "HELLO,WORLD!"
 
// Replace
string replaced = text.Replace("World", "C#"); //replaced: Hello,C#!

Víceřádkové řetězce

  • Pokud je potřebné vytvořit řetězec, který obsahuje více řádek, je pro to možné využít znak nové řádky: \n
  • Pro přehlednost v kódu může být žádoucí využít více řádků v kódu
  • Jednotlivé řádky lze spojit pomocí +
  • Lze využít víceřádkový řetězec pomocí """
string text1 = "Řádka 1\nŘádka 2 Řádka 2 pokračování";
 
// Alternativně
string text2 = "Řádka 1\n"
    + "Řádka 2 "
    + "Řádka 2 pokračování";
 
// Alternativně
string text3 = """
Řádka1
Řádka 2 Řádka 2 pokračování
""";

Práce s řetězci

Řetězení řetězců

  • Řetězce lze za sebe řetězit a tím je prodlužovat. K tomuto lze využít operátor +
  • Stejného chování lze dosáhnout využitím statické metody na datovém typu string s názvem string.Concat()
string s1 = "Ahoj" + " světe!";
 
// Alternativně
string s2 = string.Concat("Ahoj", " světe!");

Vkládání hodnot do řetězců

Vložení hodnoty do řetězce lze realizovat:

  • Zřetězením řetězce a hodnoty pomocí +
  • Použitím string interpolation
  • Vytvoří se speciální interpolated string
  • Použitím string Format
    • Využívá se speciální formátovací řetězec, ve kterém jsou umístěny značky {0} – pro hodnotu prvního parametru, {1} – pro hodnotu druhého parametru, atd.
string name = "Pepa";
 
string s1 = "Ahoj " + name;
 
// Alternativně
string s2 = $"Ahoj {name}";
 
// Alternativně
string pattern = "Ahoj {0}";
string s3 = string.Format(pattern, name);

Proč lze v .NET připojit jednoduchý datový typ k řetězci?

V .NET se při operaci jako "aa" + 7 hodnota typu int automaticky převádí na řetězec voláním metody ToString(). Díky tomu lze k řetězci připojit i jednoduché datové typy, jako jsou čísla či logické hodnoty.

StringBuilder

Řetězec je v paměti reprezentován jako pole fixní velikosti. Kdykoliv se do řetězce něco přidává na konec, např. pomocí +=, tak je nutné zajistit, že je v paměti dostatek místa. To je realizováno tvorbou nového paměťového bloku o dostatečné velikosti, překopírováváním stávajícího obsahu a přidáním nového obsahu. To je velmi paměťové drahá operace!

Z tohoto důvodu byl přidán datový typ StringBuilder z namespace System.Text, který, jak už název napovídá, umožňuje efektivnější práci s řetězci tak, že se efektivním způsobem (podobně jako v dynamickém poli) ukládají znaky do paměti se snahou minimalizovat počet nutných alokací – např. se pole zvětšuje kvadraticky – atd..

// Verze 1
string s1 = "";
 
for (int i = 0; i < 1000; i++)
{
    s1 += "0";   
}
 
// Verze 2
StringBuilder sb = new();
 
for (int i = 0; i < 1000; i++)
{
    sb.Append("0");   
}
 
string s2 = sb.ToString();

Výsledek alokace paměti na haldě

  • Verze 1: 1001.93 KB
  • Verze 2: 4.47 KB