Middle
Jak se v C# porovnávají řetězce? Porovnávají se odkazy na objekty řetězců?
sobes.tech AI
Odpověď od AI
Porovnání řetězců v C# může probíhat několika způsoby:
- Operátor
==: Pro literály řetězců a pokud mají řetězce stejný obsah, operátor==vrátítrue. Na rozdíl od jiných referenčních typů je operátor==u řetězců přetížen tak, aby porovnával obsah, nikoliv odkazy. - Metoda
Equals(): Tato metoda také porovnává obsah řetězců ve výchozím nastavení. Doporučuje se pro explicitní porovnání obsahu a může být spolehlivější, zejména při porovnání snull. Existují přetížení, která zohledňují velikost písmen a kulturu. - Metoda
String.Compare(): Statická metoda, která porovnává dva řetězce a vrací celé číslo, jež udává vztah řazení mezi nimi. Umožňuje specifikovat různé parametry porovnání (velikost písmen, kultura atd.). - Metoda
String.CompareOrdinal(): Porovnává řetězce byte po byte, bez ohledu na kulturní zvláštnosti. - Metoda
String.CompareTo(): Instanční metoda, která porovnává aktuální řetězec s jiným řetězcem nebo objektem. Je podobnáString.Compare(), ale volá se na objektu řetězce.
Odkazy na objekty řetězců se při běžném porovnání ne porovnávají přímo operátorem == nebo metodou Equals() (bez uživatelsky definovaného přetížení). Ačkoliv jsou řetězce referenční typy, == a Equals() jsou speciálně přetíženy tak, aby porovnávaly přesně obsah.
string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
// Porovnání obsahu
Console.WriteLine(str1 == str2); // true (porovnává obsah)
Console.WriteLine(str1.Equals(str2)); // true (porovnává obsah)
Console.WriteLine(str1 == str3); // true (porovnává obsah)
Console.WriteLine(str1.Equals(str3)); // true (porovnává obsah)
// Porovnání odkazů (vyžaduje explicitní převod nebo použití ReferenceEquals)
// V tomto případě mohou str1 a str2 odkazovat na stejný objekt
// díky internování řetězců. str3 bude pravděpodobně samostatný objekt.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // může být true nebo false v závislosti na JIT a CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // pravděpodobně false