Sobes.tech
Middle

Ako sa porovnávajú reťazce v C#? Porovnávajú sa odkazy na objekty reťazcov?

sobes.tech AI

Odpoveď od AI

Porovnanie reťazcov v C# môže prebiehať niekoľkými spôsobmi:

  1. Operátor ==: Pre reťazcové literály a ak majú reťazce rovnaký obsah, operátor == vráti true. Na rozdiel od iných odkazových typov je operátor == pre reťazce preťažený tak, aby porovnával obsah, nie odkazy.
  2. Metóda Equals(): Táto metóda tiež porovnáva obsah reťazcov podľa predvolenej implementácie. Odporúča sa na explicitné porovnanie obsahu a môže byť spoľahlivejšia, najmä pri porovnávaní s null. Sú k dispozícii preťaženia na porovnanie s ohľadom na veľkosť písmen a kultúru.
  3. Metóda String.Compare(): Statická metóda, ktorá porovnáva dva reťazce a vracia celé číslo, ktoré indikuje vzťah medzi reťazcami. Umožňuje nastaviť rôzne parametre porovnania (veľkosť písmen, kultúra a pod.).
  4. Metóda String.CompareOrdinal(): Porovnáva reťazce byte po byte bez ohľadu na kultúrne špecifiká.
  5. Metóda String.CompareTo(): Inštančná metóda, ktorá porovnáva aktuálny reťazec s iným reťazcom alebo objektom. Je podobná String.Compare(), ale sa volá na reťazci.

Odkazy na objekty reťazcov sa neporovnávajú priamo operátorom == alebo metódou Equals() (bez používateľského preťaženia) pri bežnom porovnaní obsahu. Hoci sú reťazce odkazové typy, pre pohodlie práce s nimi je operátor == a metóda Equals() špeciálne preťažené na porovnanie obsahu.

string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

// Porovnanie obsahu
Console.WriteLine(str1 == str2);           // true (porovnáva sa obsah)
Console.WriteLine(str1.Equals(str2));    // true (porovnáva sa obsah)
Console.WriteLine(str1 == str3);           // true (porovnáva sa obsah)
Console.WriteLine(str1.Equals(str3));    // true (porovnáva sa obsah)

// Porovnanie odkazov (vyžaduje explicitné pretypovanie alebo použitie ReferenceEquals)
// V tomto prípade môžu str1 a str2 odkazovať na ten istý objekt
// kvôli interningu reťazcov. str3 bude pravdepodobne samostatný objekt.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // môže byť true alebo false v závislosti od JIT a CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // pravdepodobne false