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

В разделе 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, что такого особенного в строке? Почему среда выполнения не смотрит на ваши объекты и не видит, эй, может быть, это то же самое внутри, давайте сделаем ту же ссылку.


person Andyz Smith    schedule 23.05.2015    source источник
comment
Я только что построил и запустил это с помощью VS 2013; Framework V4.5.2, и он вернул 0, как и ожидалось, и задокументировано. Возможно, у вас где-то опечатка. Аналогично с Framework V4.5. Это происходит как с static List<object> MsgLst;, так и с static List<string> MsgLst;.   -  person Pieter Geerkens    schedule 25.05.2015
comment
Ожидаете ли вы, что среда выполнения будет отслеживать все строки в памяти, поскольку она вычисляет новую строку, чтобы увидеть, должна ли новая строка иметь общую ссылку? Это было бы особенно расточительно для вычислений, которые генерировали много временных строк.   -  person Enigmativity    schedule 25.05.2015
comment
Если я ссылаюсь на строку как на объект, я хочу вернуть этот объект. Период. Стажировка вызывает утечку в этой метафоре.   -  person Andyz Smith    schedule 25.05.2015
comment
@Pieter Geerkens хорошо, я просто говорю, что не хочу первого, я хочу последнего. Так что я ожидаю 2, а не 0.   -  person Andyz Smith    schedule 25.05.2015
comment
Документация для List<T>IndexOf(T): Выполняет поиск указанного объекта и возвращает отсчитываемый от нуля индекс первого вхождения во всем списке‹T›. Ссылка:msdn.microsoft.com/en-us/library/e4w08k17(v=vs .110).aspx   -  person Pieter Geerkens    schedule 25.05.2015
comment
Да, я понял тебя, чувак.   -  person Andyz Smith    schedule 25.05.2015


Ответы (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
person Lee    schedule 23.05.2015
comment
И (object)abc == (object)abc2 даст аналогичные результаты? - person Andyz Smith; 23.05.2015
comment
@AndyzSmith - == для object проверяет равенство ссылок, так что да. - person Lee; 23.05.2015
comment
Создано программно, являясь ключевой фразой. - person Andyz Smith; 23.05.2015
comment
Г-н Скит может добавить кое-что поучительное: как объясняли другие, интернирование строк происходит для всех строковых литералов, но не для динамически создаваемых строк (например, тех, которые считываются из базы данных или файла или создаются с помощью StringBuilder или String.Format.) stackoverflow.com/questions/555871/c-strings-with-same -содержание - person Andyz Smith; 23.05.2015