Что выведут сравнения s1==s2, (object)s1==(object)s2, s2==s3 и (object)s2==(object)s3 для строк, собранных через Format, конкатенацию и литерал?

C# / .NET Основы языка Junior

Что это: Оператор == для string сравнивает содержимое, а приведение к object сравнивает ссылки. Format создаёт новый объект, конкатенация литералов может дать интернированную ссылку, совпадающую с s3.

Почему важно: Разделяет value-семантику string и reference-семантику object, что критично при оптимизации памяти и сравнении в коллекциях.

Под капотом: Компилятор может сложить строковые литералы на этапе компиляции и поместить результат в intern pool. string.Format всегда создаёт новый экземпляр в куче во время выполнения.

Типичная ошибка: Считать, что если s1 == s2, то (object)s1 == (object)s2, путая перегрузку оператора == с reference equality.

var s1 = string.Format('{0}{1}', 'abc', 'cba');
var s2 = 'abc' + 'cba';
var s3 = 'abccba';

Console.WriteLine(s1 == s2);           // true — сравнение по значению
Console.WriteLine((object)s1 == (object)s2); // false — разные ссылки
Console.WriteLine(s2 == s3);           // true
Console.WriteLine((object)s2 == (object)s3); // true — интернирование литерала