ReferenceEquals работает неправильно со строками

почему в этой ситуации 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 ответов


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

читайте в теме интернировании строк подробнее об этом поведении. Для начала рассмотрим:

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

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

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


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

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

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


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

с уважением, Петр!--3-->


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