ReferenceEquals неправильно работает со строками - PullRequest
8 голосов
/ 02 февраля 2012

Почему в этой ситуации ReferenceEquals метод объекта ведет себя иначе?

string a= "fg";
string b= "fg";
Console.WriteLine(object.ReferenceEquals(a, b));

Так что в этой ситуации получается результат true. В случае, он сравнивает значения моих строк, а не ссылки. Но когда я пишу что-то вроде:

StringBuilder c = new StringBuilder("fg");
string d = c.ToString();
Console.WriteLine(object.ReferenceEquals(a, d));

В этом случае он работает нормально, и результат равен false, потому что он сравнивает ссылки на мои объекты.

Ответы [ 4 ]

15 голосов
/ 02 февраля 2012

Первый пример имеет постоянную времени компиляции "fg", на которую ссылаются две переменные.Поскольку это постоянная времени компиляции, две переменные ссылаются на один объект.Ссылки равны.

Читайте в теме интернирование строк , чтобы узнать больше об этом поведении.Для начала рассмотрим:

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

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

Во втором примере только одна является постоянной времени компиляции, другая - результатом некоторых операций.a и d не ссылаются на один и тот же объект, поэтому вы получаете ложный результат из ReferenceEquals.

2 голосов
/ 02 февраля 2012

В обоих случаях он работает правильно.

Причина, по которой a и b - это один и тот же строковый объект, заключается в том, что компилятор заметил, что вы указали одну и ту же строку дважды, и повторно использовал одну и ту же строку.строковый объект для инициализации a и b.

Это обычно происходит с каждой строковой константой в вашем приложении.

0 голосов
/ 02 февраля 2012

Согласно этому посту это связано с тем, что называется интернированием. a и b в вашем случае две переменные, указывающие на один и тот же экземпляр, поэтому ReferenceEquals возвращает true.

0 голосов
/ 02 февраля 2012

Поскольку вы ссылаетесь на один и тот же литерал ("fg"), обе ваши строки на самом деле будут указывать на одну и ту же вещь.Пожалуйста, взгляните на эту статью: http://csharpindepth.com/Articles/General/Strings.aspx (абзац "Стажировка").

С уважением, Петр

...