2011-04-14 3 views
2

Можно создать дубликат:
Please tell why two references are same for string object in case of string(Code written below)Как работает оператор == по умолчанию для строк?

Когда я пишу в C# s1 == s2 где и объявлена ​​как строка будет компилятором сравнивать ссылки или содержание? То есть если == переоценивается для класса string?

Я просто удивляюсь, почему этот код печатает «истинные»:

string s1 = "hello" 
string s2 = s1 + " "; 
s2 = s2.Trim(); // i expect new object here 
Console.WriteLine(s2 == s1); 

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

Нормально ли использовать == для сравнения строк в C#?

upd: Спасибо всем, почти все ответы верны. В заключение:

  • Да, это нормально использовать «==» для сравнения строки в C#
  • строк будут сравниваться по содержанию (не ссылаться)
  • == оператора для строк не является виртуальным.
  • строки в C# неизменны (это похоже на Java)

Это поведение отличается от Java, где «==» для класса строк сравнивает ссылки.

смотри также Why strings does not compare references?

По моему личному мнению, язык не позволяет переопределить или перегрузки == оператора, потому что делает это так сложно, как с ++ :)

+0

Из-за того, как .NET обрабатывает интернирование строк, сравнение строк по ячейкам памяти часто приводит к неожиданным результатам. Я предполагаю, что это основное отличие от Java (действительно ли Java выполняет интернирование строк)? – MattDavey

ответ

7

Операторы не могут быть переопределены полиморфны, но они могут быть перегружены , который в случае строки. Проверка перегрузки для равенства контента (по порядку, без чувствительности к культуре).Так, например:

string s1 = "hello"; 
string s2 = (s1 + " ").Trim(); 

object o1 = s1; 
object o2 = s2; 

Console.WriteLine(s1 == s2); // True - calls overloaded ==(string, string) 
Console.WriteLine(o1 == o2); // False - compares by reference 

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

3

да, по умолчанию при использовании == его чеки для справки equiality, но перекрываться для строк, так что он проверяет содержание (потому что строки являются неизменными, а)

This is great article that I like (и автор Jon здесь также :))

0

Даже т класс System.String является ссылочным типом (который «string» является псевдонимом). Метод операции == этого типа переопределяется, чтобы обеспечить сравнение между содержимым типов строк.

В вашем примере они равны, потому что содержимое типов строк одинаково.

0

s2 == s1 даст вам логический результат, да. Что касается программирования .NET, мне всегда было лучше использовать String.Compare.

0

Да, это нормальная (но не обязательно хорошая практика) сравнение строк в C# с ==. String.Compare - более надежный способ сравнения, который также может заботиться о разных наборах символов и чувствительности к регистру.

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