Sobes.tech
Middle

Kuidas toimub stringide võrdlemine C#-s? Kas võrreldakse string-objektide viiteid?

sobes.tech AI

Vastus AI-lt

Sõne võrdlemine C#-s võib toimuda mitmel viisil:

  1. == operaator: Stringi literaalide puhul ja kui stringidel on sama sisu, tagastab == true. Erinevalt teistest viidete tüüpidest on == operaator spetsiaalselt ülekoormatud sisu võrdlemiseks, mitte viidete.
  2. Equals() meetod: See meetod võrdleb samuti stringide sisu vaikimisi. Soovitatav on selge sisu võrdlemiseks ning võib olla usaldusväärsem, eriti null-iga võrreldes. On ülekoormusi, mis arvestavad suurust ja kultuuri.
  3. String.Compare() meetod: Staatiline meetod, mis võrdleb kahte stringi ja tagastab täisarvu, mis näitab nende vahelist järjekorda. Võimaldab määrata erinevaid võrdlusparameetreid (suurus, kultuur ja teised).
  4. String.CompareOrdinal() meetod: Võrdleb stringe baitide kaupa, arvestamata kultuurilisi omadusi.
  5. String.CompareTo() meetod: Instantsmeetod, mis võrdleb käesolevat stringi teise stringi või objekti vastu. Sarnane String.Compare()-le, kuid kutsutakse stringi objektil.

Stringi objekti viited ei võrrelda otse == või Equals() meetodiga (ilma kasutaja ülekoormuseta) tavapärases sisus. Kuigi stringid on viidetüübid, on == operaator ja Equals() spetsiaalselt ülekoormatud nende sisu võrdlemiseks.

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

// Sisu võrdlemine
Console.WriteLine(str1 == str2);           // true (sisu võrdleb)
Console.WriteLine(str1.Equals(str2));    // true (sisu võrdleb)
Console.WriteLine(str1 == str3);           // true (sisu võrdleb)
Console.WriteLine(str1.Equals(str3));    // true (sisu võrdleb)

// Viidete võrdlemine (vajab selget ülekoormust või `ReferenceEquals` kasutamist)
// Antud juhul võivad str1 ja str2 viidata samale objektile,
// stringi interningu tõttu:
Console.WriteLine(object.ReferenceEquals(str1, str2)); // võib olla true või false, sõltuvalt JIT ja CLR-st
Console.WriteLine(object.ReferenceEquals(str1, str3)); // tõenäoliselt false