Sobes.tech
Middle

Kaip vyksta eilučių palyginimas C#? Ar lyginamos eilutės objektų nuorodos?

sobes.tech AI

Atsakymas iš AI

C# eilutės palyginimas gali būti atliekamas keliais būdais:

  1. Operatorius ==: Eilutės literalų atveju ir jei eilutės turi tą patį turinį, operatorius == grąžins true. Skirtingai nuo kitų nuorodinių tipų, == operatorius yra perkrautas eilutėms, kad palygintų turinį, o ne nuorodas.
  2. Metodas Equals(): Šis metodas taip pat palygina eilutės turinį pagal numatytąją implementaciją. Rekomenduojama aiškiam turinio palyginimui ir gali būti patikimesnė, ypač lyginant su null. Yra perkrovų, atsižvelgiant į raidžių dydį ir kultūrą.
  3. Metodas String.Compare(): Statinis metodas, kuris palygina dvi eilutes ir grąžina sveiką skaičių, nurodantį jų santykį. Leidžia nurodyti įvairius palyginimo parametrus (raidžių dydį, kultūrą ir kt.).
  4. Metodas String.CompareOrdinal(): Palygina eilutes baitais, neatsižvelgiant į kultūrinius ypatumus.
  5. Metodas String.CompareTo(): Inštancinis metodas, kuris palygina dabartinę eilutę su kita eilute ar objektu. Panašus į String.Compare(), bet iškviečiamas eilutės objekte.

Eilutės objektų nuorodos ne yra tiesiogiai lyginamos operatoriumi == ar metodu Equals() (be naudotojo perkrovimo) įprastame turinio palyginime. Nors eilutės yra nuorodų tipai, == operatorius ir Equals() yra specialiai perkrauti turinio palyginimui.

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

// Turinio palyginimas
Console.WriteLine(str1 == str2);           // true (palyginamas turinys)
Console.WriteLine(str1.Equals(str2));    // true (palyginamas turinys)
Console.WriteLine(str1 == str3);           // true (palyginamas turinys)
Console.WriteLine(str1.Equals(str3));    // true (palyginamas turinys)

// Nuorodų palyginimas (reikalauja aiškaus perkrovimo arba `ReferenceEquals` naudojimo)
// Šiuo atveju str1 ir str2 gali nurodyti tą patį objektą,
// dėl eilutės interningo:
Console.WriteLine(object.ReferenceEquals(str1, str2)); // gali būti true arba false, priklausomai nuo JIT ir CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // greičiausiai false