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.