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:
- Operátor
==: Pre reťazcové literály a ak majú reťazce rovnaký obsah, operátor==vrátitrue. Na rozdiel od iných odkazových typov je operátor==pre reťazce preťažený tak, aby porovnával obsah, nie odkazy. - 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í snull. Sú k dispozícii preťaženia na porovnanie s ohľadom na veľkosť písmen a kultúru. - 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.). - Metóda
String.CompareOrdinal(): Porovnáva reťazce byte po byte bez ohľadu na kultúrne špecifiká. - 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