Как компилятор .NET сравнивает две строки? - PullRequest
1 голос
/ 12 апреля 2010
string a="I am comparing 2 string";
string b="I am comparing 2 string";

if(a==b)
  return true;
else
  return false;

Как компилятор .NET сравнивает две строки?Работает ли строка как struct (int)?Строка является классом, поэтому a = b означает, что мы сравниваем 2 объекта, но я хочу сравнить 2 значения.

Ответы [ 6 ]

4 голосов
/ 12 апреля 2010

Класс String перегружает оператор ==, поэтому да, он сравнивает значения строк так же, как сравнивает типы значений, такие как int.

(Кстати, компилятор также интернализует в коде буквенные строки, поэтому строковые переменные a и b будут фактически ссылаться на один и тот же строковый объект. Если вы используете Object.ReferenceEquals(a,b), он также вернет true.)

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

Обратите внимание, что ваш вопрос немного сложен. Потому что ReferenceEquals ТАКЖЕ вернет true.

Это из-за стажировки: http://en.wikipedia.org/wiki/String_interning

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

Здесь нужно помнить о разных вещах.

Во-первых, все идентичные строки констант будут интернированы, так что обе ссылки равны для начала.Следовательно, даже если вы сделали ReferenceEquals() здесь, вы получите «true» в результате.Таким образом, только для строки, построенной (например, с StringBuilder, или прочитанной из файла и т. Д.), Вы получите другую ссылку и, следовательно, false при выполнении сравнения равенства ссылок.

Если оба объекта известнычтобы быть строками во время компиляции, компилятор выдаст код для сравнения их значения (перегруженный оператор == на System.String), а не их ссылок.Обратите внимание, что как только вы сравниваете его со ссылкой типа object, это уже не так.

Не выполняется проверка во время выполнения для сравнения строки по значению, и компилятор не выдает .Equals() вызов оператора ==.

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

Строки сравниваются средой выполнения, а не компилятором. Сравнение выполняется оператором Equality .

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

Хотя строка является ссылочным типом, операторы равенства (== и! =) Определены для сравнения значений строковых объектов, а не ссылок. Это делает тестирование на равенство строк более интуитивным.

C # строка

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

System.String - это класс, у которого перегружен оператор == для сравнения содержимого строк.Это позволяет ему сравниваться со значением и, в то же время, быть ссылочным типом в других отношениях.

...