Почему строки не сравнивает ссылки? - PullRequest
8 голосов
/ 05 марта 2011

Я знаю, что это особый случай, но почему == между строками возвращает, если их значение равно, а не когда их ссылка равна.Это как-то связано с операторами перегрузки?

Ответы [ 5 ]

13 голосов
/ 05 марта 2011

Оператор == перегружен в String, чтобы выполнить равенство значений вместо ссылочного равенства. Идея состоит в том, чтобы сделать строки более понятными для программиста и избежать ошибок, возникающих при использовании равенства ссылок для их сравнения (не так уж и редко в Java, особенно для начинающих).

Пока мне никогда не приходилось сравнивать строки по ссылке, если честно. Если вам нужно сделать это, вы можете использовать object.ReferenceEquals().

5 голосов
/ 05 марта 2011

Поскольку строки являются неизменяемыми, а среда выполнения может выбрать объединение любых двух строк с одинаковым содержимым в одну ссылку. Поэтому строки сравнения ссылок на самом деле не имеют никакого смысла.

2 голосов
/ 05 марта 2011

Да.Из .NET Reflector приведена перегрузка оператора равенства класса String:

public static bool operator ==(string a, string b)
{
    return Equals(a, b);
}
2 голосов
/ 05 марта 2011

для строки, == сравнивает по значению

"Несмотря на то, что строка является ссылочным типом, операторы равенства (== и! =) Определены для сравнения значений строкиобъекты, а не ссылки (7.9.7 Операторы равенства строк). Это делает тестирование на равенство строк более интуитивным. "

Короче говоря, == для строк сравнивает строки по значению, а не по ссылке, потому что спецификация C #говорит, что должен.

0 голосов
/ 05 марта 2011

Операторы равенства (== и !=) определены для сравнения значений строковых объектов, а не ссылок.

Не было ни одной ситуации, в которой мне пришлось бысравните ссылки, но если вы хотите это сделать, вы можете использовать:

object.ReferenceEquals().
...