"bool" как объект против "string" как объектное равенство - PullRequest
2 голосов
/ 16 апреля 2010

Я относительно новичок в C #, и сегодня я заметил кое-что интересное, что, я думаю, я никогда не заметил или, возможно, я что-то упускаю. Вот тест NUnit, чтобы привести пример:

object boolean1 = false;
object booloan2 = false;
Assert.That(boolean1 == booloan2);

Этот модульный тест не пройден, но он проходит:

object string1 = "string";
object string2 = "string";
Assert.That(string1 == string2);

Я не настолько удивлен сам по себе, что первый не может видеть как boolean1, а boolean2 - это разные ссылки. Но меня беспокоит то, что первый терпит неудачу, а второй проходит. Я читал (где-то в MSDN), что для этого было сделано какое-то волшебство с классом String. Я думаю, что мой вопрос действительно заключается в том, почему это поведение не было воспроизведено в bool? Как примечание ... если логические значения 1 и 2 объявлены как bool, то проблем нет.

В чем причина этих различий или почему это было реализовано таким образом? Есть ли ситуация, когда вы хотите ссылаться на объект bool для чего-либо, кроме его значения?

Ответы [ 3 ]

6 голосов
/ 16 апреля 2010

Это потому, что строки на самом деле ссылаются на один и тот же экземпляр. Строки интернированы, так что уникальные строки используются повторно. Это означает, что в вашем коде две строковые переменные будут ссылаться на один и тот же экземпляр интернированной строки.

Подробнее об этом можно прочитать здесь: Строки в .NET и C # ( от Jon Skeet )

Обновление
Просто для полноты картины; как указывает Энтони строка литералы интернированы, что можно показать с помощью следующего кода:

object firstString = "string1";
object secondString = "string1";
Console.WriteLine(firstString == secondString); // prints True

int n = 1;
object firstString = "string" + n.ToString();
object secondString = "string" + n.ToString();
Console.WriteLine(firstString == secondString); // prints False
0 голосов
/ 16 апреля 2010

Как сказал Фредрик, вы делаете эталонное сравнение с логическим сравнением. Причина того, что строковый сценарий работает, заключается в том, что оператор == был перегружен для строк, чтобы выполнить сравнение значений. См. Страницу System.String в MSDN.

0 голосов
/ 16 апреля 2010

Перегрузка оператора.

У логического класса нет перегруженного оператора ==. Класс String делает.

...