Sobes.tech
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:

  1. 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.
  2. 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í s null. Existují přetížení, která zohledňují velikost písmen a kulturu.
  3. 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.).
  4. Metoda String.CompareOrdinal(): Porovnává řetězce byte po byte, bez ohledu na kulturní zvláštnosti.
  5. 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