Sobes.tech
Middle

Как се сравняват низове в C#? Сравняват ли се референциите към обектите на низовете?

sobes.tech AI

Отговор от AI

Сравняването на низове в C# може да се извърши по няколко начина:

  1. Оператор ==: За низови литерали и ако низовете имат еднакво съдържание, операторът == ще върне true. За разлика от други референтни типове, операторът == за низове е пренаписан, за да сравнява съдържанието, а не референтите.
  2. Метод Equals(): Този метод също сравнява съдържанието на низовете по подразбиране. Препоръчва се за явно сравняване на съдържанието и може да бъде по-надежден, особено при сравнение с null. Има пренаписвания, които вземат предвид чувствителността към големи/малки букви и култура.
  3. Метод String.Compare(): Статичен метод, който сравнява два низа и връща цяло число, което показва отношението на подреждане между тях. Позволява да се зададат различни параметри за сравнение (чувствителност към големи/малки букви, култура и др.).
  4. Метод String.CompareOrdinal(): Сравнява низовете байт по байт, без да взема предвид културните особености.
  5. Метод String.CompareTo(): Метод на инстанция, който сравнява текущия низ с друг низ или обект. Подобен е на String.Compare(), но се извиква върху обект от тип низ.

Референциите към обектите низове не се сравняват директно с оператора == или метода 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 могат да сочат към един и същи обект
// благодарение на интернирането на низове. str3, вероятно, ще бъде отделен обект.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // може да е true или false в зависимост от JIT и CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // вероятно false