Middle
Как се сравняват низове в C#? Сравняват ли се референциите към обектите на низовете?
sobes.tech AI
Отговор от AI
Сравняването на низове в C# може да се извърши по няколко начина:
- Оператор
==: За низови литерали и ако низовете имат еднакво съдържание, операторът==ще върнеtrue. За разлика от други референтни типове, операторът==за низове е пренаписан, за да сравнява съдържанието, а не референтите. - Метод
Equals(): Този метод също сравнява съдържанието на низовете по подразбиране. Препоръчва се за явно сравняване на съдържанието и може да бъде по-надежден, особено при сравнение сnull. Има пренаписвания, които вземат предвид чувствителността към големи/малки букви и култура. - Метод
String.Compare(): Статичен метод, който сравнява два низа и връща цяло число, което показва отношението на подреждане между тях. Позволява да се зададат различни параметри за сравнение (чувствителност към големи/малки букви, култура и др.). - Метод
String.CompareOrdinal(): Сравнява низовете байт по байт, без да взема предвид културните особености. - Метод
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