2010-04-12 4 views
1
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)? string - класс, поэтому a = b означает, что мы сравниваем 2 объекта, но я хочу сравнить 2 значения.Как компилятор .NET сравнивает две строки?

+1

не быть педантичным но INT является структура (тип значения) в то время как строка представляет собой класс (тип ссылки). – Asher

ответ

4

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

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

+1

Обратите внимание, что интернирование происходит при загрузке сборки по всему домену приложения. http://blogs.msdn.com/cbrumme/archive/2003/04/22/51371.aspx – Lucero

0

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

0

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

C# string

0

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

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^