Sobes.tech
Middle

Ինչպես է տեղի ունենում տողերի համեմատությունը C#-ում: Համեմատվում են տողերի օբյեկտների հղումները?

sobes.tech AI

Պատասխան AI-ից

C#-ում տողերի համեմատումը կարող է կատարվել մի քանի եղանակով:

  1. == օպերատոր: Տողային լիտերալների համար և եթե տողերը ունեն նույն պարունակությունը, == օպերատորը կվերադարձնի true: Այլ ռեֆերենցիոն տիպերի համեմատ, == օպերատորը հագեցած է համեմատել պարունակությունը, ոչ թե հղումները:
  2. Equals() մեթոդ: Այս մեթոդը նույնպես համեմատում է տողերի պարունակությունը ըստ նախնական արժեքի: Խորհուրդ է տրվում հստակ համեմատության համար, հատկապես null-ի հետ համեմատության ժամանակ: Կան տարբերակներ՝ հաշվի առնելով մեծատառ-փոքրատառ և մշակույթ:
  3. String.Compare() մեթոդ: סטատիկ մեթոդ, որը համեմատում է երկու տողեր և վերադարձնում ամբողջ թիվ, որը ցույց է տալիս հարաբերությունը:
  4. String.CompareOrdinal() մեթոդ: Համեմատում է տողերը բայթով՝ առանց մշակույթի առանձնահատկությունների:
  5. String.CompareTo() մեթոդ: Օբյեկտի մեթոդ, որը համեմատում է ընթացիկ տողը այլ տողի կամ օբյեկտի հետ:

Տողերի օբյեկտային հղումները չեն համեմատվում ուղղակի == կամ Equals() մեթոդով (առանց օգտագործողի կողմից հագեցած տարբերակների) սովորական պարունակության համեմատ: Թեև տողերը ռեֆերենցիոն տիպեր են, == օպերատորն ու Equals() մեթոդը հատուկ հագեցած են պարունակության համեմատության համար:

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

// Պարունակության համեմատություն
Console.WriteLine(str1 == str2);           // true (համեմատվում է պարունակությունը)
Console.WriteLine(str1.Equals(str2));    // true (համեմատվում է պարունակությունը)
Console.WriteLine(str1 == str3);           // true (համեմատվում է պարունակությունը)
Console.WriteLine(str1.Equals(str3));    // true (համեմատվում է պարունակությունը)

// Հղումների համեմատություն (պահանջվում է հստակ վերածում կամ `ReferenceEquals`-ի օգտագործում)
// Այս դեպքում str1 և str2 կարող են հղում ունենալ նույն օբյեկտին՝
// տողերի ինտերնինգի պատճառով:
Console.WriteLine(object.ReferenceEquals(str1, str2)); // կարող է լինել true կամ false՝ կախված JIT և CLR-ից
Console.WriteLine(object.ReferenceEquals(str1, str3)); // հավանաբար false