Ř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"
- Např.:
- 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.
- Využívá se speciální formátovací řetězec, ve kterém jsou umístěny značky
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" + 7hodnota typuintautomaticky převádí na řetězec voláním metodyToString(). 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