Могут ли две одинаковые строки когда-либо сравнивать объекты с разными экземплярами?

В разделе 7.10.7 языка программирования C# (А. Хейлсберг и др., Четвертое издание 2011 г., аннотированный для 4.0) говорится, что "когда два отдельных экземпляра строки содержат одинаковые последовательности символов, значения строк равны, но ссылки разные."

Это когда-либо случай во время выполнения? Разве среда выполнения.NET и BCL ВСЕГДА не объединяют две одинаковые строки в одном и том же справочном блоке?

Я понимаю, что в книге говорится о "спецификации", но следующий вопрос - существует ли какая-либо известная реализация C#, которая ведет себя таким образом?

РЕДАКТИРОВАТЬ

Хорошо, что действительно беспокоит меня это:

String FirstOne = "StatusOK"
String MiddleOne = "StatusOK"
String LastOne = "StatusOK"

Integer FindMeOne(object AnythingtoFind) { return MsgLst.IndexOf(AnythingToFind) }

List<String> MsgLst;
MsgLst.Add(FirstOne);
MsgLst.Add(MiddleOne);
Msglst.Add(LastOne);

Integer foo = FindMeOne( LastOne );

Я не ожидаю, что foo будет 1! Я думаю, что я просто глупый в этом смысле.

ОБНОВЛЕНИЕ Все, что мне нужно сделать, чтобы получить то, что я хочу, это:

public class MyNiceStringsThatICanFind 
{ 
private String foobar;
}

Но опять же это не приятно. Если объекты отслеживают себя с помощью HashCode, что такого особенного воняющего в строке? Почему среда выполнения не смотрит на ваши Объекты и не видит, эй, может быть, это то же самое внутри, давайте сделаем то же самое.

1 ответ

Такое поведение равенства применяется только к строковым литералам (хотя см. NoStringInterning). Если вы создаете одинаковые строки во время выполнения, они не обязательно ссылаются на один и тот же экземпляр:

var abc = "abc";
var ab = "ab";
var c = "c";

var abc2 = ab + c;
bool eq = Object.ReferenceEquals(abc, abc2);  //false

var interned = String.Intern(abc2);
bool ieq = Object.ReferenceEquals(interned, abc);  //true
Другие вопросы по тегам