Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Разница в обьектах, содержащих одинаковые значения

iweywey weywey Ученик (131), на голосовании 3 месяца назад
var s1 = string.Format("{0}{1}", "abc", "cba");
var s2 = "abc" + "cba";
var s3 = "abccba";

Console.WriteLine(s1 == s2);
Console.WriteLine((object)s1==(object)s2);
Console.WriteLine(s2==s3);
Console.WriteLine((object)s2==(object)s3);

Почему обьект s1 не будет равен обьекту s2, но при этом обьект s3 будет равен обьекту s2 ? Они же все имеют одинаковое значение, так в чем причина
Голосование за лучший ответ
Jurijus Zaksas Искусственный Интеллект (443430) 4 месяца назад
Сдаеццо мне, это из-за замыканий. В замыкании не используется интерфейс IEquatable, поэтому ссылки на объекты не равны.
Хотя эффект, конечно, интересный...
АМудрец (14801) 4 месяца назад
Это из-за интернирования строк.
s2 - компилятор уберёт сложение и сразу запишет туда "abccba"
Соответственно s2 и s3 будут иметь одну и ту же ссылку.
string.Format - создаст отдельный объект с другой ссылкой.
Поэтому:
1) True, потому, что вызывается перегруженный оператор сравнения для строк.
2) False, потому, что ссылки не равны.
3) True, потому, что вызывается перегруженный оператор сравнения для строк.
4) True, потому, что ссылки равны.

АМудрец (14801) 4 месяца назад
Не туда отпрвил. Вы почему-то ерунду написали. И никакого замыкания здесь нет.
А Мудрец (14801) 4 месяца назад
Это из-за интернирования строк.
s2 - компилятор уберёт сложение и сразу запишет туда "abccba"
Соответственно s2 и s3 будут иметь одну и ту же ссылку.
string.Format - создаст отдельный объект с другой ссылкой.
Поэтому:
1) True, потому, что вызывается перегруженный оператор сравнения для строк.
2) False, потому, что ссылки не равны.
3) True, потому, что вызывается перегруженный оператор сравнения для строк.
4) True, потому, что ссылки равны.
iweywey weyweyУченик (131) 3 месяца назад
понял, спасибо теперь все ясно
Похожие вопросы