Сравнение одинаковых строк в C# выдаёт false [дубликат]

118
14 августа 2019, 16:50

На данный вопрос уже ответили:

  • Что такое interning и как им пользоваться 1 ответ

Почему будет выведен false? Можно, пожалуйста, объяснить как можно подробнее?

string s1 = string.Format("{0}{1}", "abc", "cba");
string s2 = "abc" + "cba";
Console.WriteLine((object)s1==(object)s2);

Более расширенный ответ: Что такое interning и как им пользоваться

Answer 1

В последней строке вы приводите каждую сравниваемую строку к object'у. Объекты в с C# являются ссылочными типами и сравниваются соответственно по ссылке. Ваши строки - разные объекты, хранящиеся по разным адресам, и, следовательно, имеющие разные ссылки на них.

Впрочем string в C# - ссылочный тип. Следовательно строки по идее должны сравниваться также по ссылкам, и сравнение должно выдавать false даже без приведения к object. Но это не так, поскольку сравнение строк в C# выполняется по значению. Подобное поведение удобно и предпочтительно в большинстве случаев. Помимо этого стоит отметить и то, что и копируются строки тоже по значению, следовательно при изменении строки вы на самом деле создаёте новую, а не меняете старую

Answer 2

потому, что ты сравниваешь ссылки на обьекты, а не сами обьекты.

Все reference-type обьекты через == сравниваются по ссылке.

Окроме тех типов данных, в которых == переопределен. В случае с строками -- этот метод переопределен и сравнивается значение, а не ссылка.

Когда ты сравниваешь (object)s1==(object)s2

то ты используешь оригинальный == а не переопределенный. А т.к. это разные обьекты и они находятся в разных местах памяти, вот тебе и возвращает false.

READ ALSO
Использование библиотеки jQuery contextMenu

Использование библиотеки jQuery contextMenu

Скачал с nuget jQuery contextMenuВсё необходимое подключил к проекту

99
Индексаторы C#, значения вывода, при различных индексах

Индексаторы C#, значения вывода, при различных индексах

я понимаю для чего служат индексаторы, но вот столкнулся с заданием, и просто не понимаю, как правильно вызвать и как передать

103
Ошибка The property is not a navigation property of entity type

Ошибка The property is not a navigation property of entity type

Пытаюсь установить связь, с таблицей другой в asp net core, у меня выдает ошибку:

122
Как удалить данные из DataSet?

Как удалить данные из DataSet?

Хочу удалить из базы выделенный элемент

99