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:
- Operatorius
==: Eilutės literalų atveju ir jei eilutės turi tą patį turinį, operatorius==grąžinstrue. Skirtingai nuo kitų nuorodinių tipų,==operatorius yra perkrautas eilutėms, kad palygintų turinį, o ne nuorodas. - 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 sunull. Yra perkrovų, atsižvelgiant į raidžių dydį ir kultūrą. - 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.). - Metodas
String.CompareOrdinal(): Palygina eilutes baitais, neatsižvelgiant į kultūrinius ypatumus. - 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