Ответ вслух Junior Строки обновлено

Как сравнивать строки в C#

Вопрос

Чем отличаются ==, Equals, string.Compare и ReferenceEquals для строк?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

У string перегружен оператор ==, он сравнивает содержимое по порядку символов. Но перегрузки выбираются по статическому типу: если обе переменные object, сработает сравнение ссылок, и одинаковые по содержимому строки окажутся «разными».

Что должно прозвучать в ответе

  • `==` у string перегружен и сравнивает содержимое, если оба операнда статически string

  • Если тип object, `==` сравнивает ссылки

  • `Equals` с StringComparison позволяет выбрать регистр и культуру

  • `Compare` возвращает порядок для сортировки, а не только равенство

  • `ReferenceEquals` проверяет один ли это объект, полезно только для понимания интернирования

Что могут спросить следом

  • Что такое интернирование и какие строки интернируются автоматически?
  • Почему для ключей словаря нужен StringComparer?

Разбор

У string перегружен оператор ==, он сравнивает содержимое по порядку символов. Но перегрузки выбираются по статическому типу: если обе переменные object, сработает сравнение ссылок, и одинаковые по содержимому строки окажутся «разными».

Equals у строки тоже сравнивает содержимое, а перегрузка с StringComparison позволяет явно выбрать: Ordinal для идентификаторов, OrdinalIgnoreCase без учёта регистра, CurrentCulture для пользовательского текста. string.Compare возвращает отрицательное, ноль или положительное и нужен для сортировки.

ReferenceEquals показывает, один ли это объект. Литералы интернируются, поэтому два одинаковых литерала дают true, а строки, собранные во время выполнения, нет. В прикладном коде я всегда указываю StringComparison явно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.