C # разница между == и Equals () - PullRequest
499 голосов
/ 02 мая 2009

У меня есть условие в приложении silverlight, которое сравнивает 2 строки, по какой-то причине при использовании == возвращается false , а .Equals() возвращает true .

Вот код:

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
    // Execute code
}

if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
    // Execute code
}

Есть причина, почему это происходит?

Ответы [ 17 ]

2 голосов
/ 26 января 2015

Существует еще одно измерение в более раннем ответе @BlueMonkMN. Дополнительное измерение заключается в том, что ответ на заглавный вопрос @ Drahcir в том виде, в котором он указан, также зависит от того, как мы достигли значения string. Для иллюстрации:

string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
string s5 = "te" + "st";
object s6 = s5;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));

Console.WriteLine("\n  Case1 - A method changes the value:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));

Console.WriteLine("\n  Case2 - Having only literals allows to arrive at a literal:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s5), s1 == s5, s1.Equals(s5));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s6), s1 == s6, s1.Equals(s6));

Вывод:

True True True

  Case1 - A method changes the value:
False True True
False False True

  Case2 - Having only literals allows to arrive at a literal:
True True True
True True True
1 голос
/ 03 июня 2019

Так же, как дополнение к и без того хорошим ответам: это поведение НЕ ограничено строками или сравнением различных типов чисел. Даже если оба элемента имеют тип объекта одного и того же базового типа. "==" не сработает.

На следующем снимке экрана показаны результаты сравнения двух объектов {int} - значения

Example From VS2017

0 голосов
/ 14 февраля 2014

Токен == в C # используется для двух разных операторов проверки равенства. Когда компилятор обнаруживает этот токен, он проверяет, реализован ли в одном из сравниваемых типов перегрузка оператора равенства для сравниваемых типов конкретных комбинаций (*) или для комбинации типов, в которую можно преобразовать оба типа. Если компилятор обнаружит такую ​​перегрузку, он будет использовать ее. В противном случае, если оба типа являются ссылочными типами и не являются несвязанными классами (могут быть интерфейсом или связанными классами), компилятор будет рассматривать == как оператор сравнения ссылок. Если ни одно из условий не применимо, компиляция завершится неудачей.

Обратите внимание, что некоторые другие языки используют отдельные токены для двух операторов проверки равенства. Например, в VB.NET токен = используется в выражениях исключительно для перегружаемого оператора проверки на равенство, а Is используется в качестве оператора контрольного или нулевого теста. Использовать = для типа, который не переопределяет оператор проверки на равенство, не удастся, так же как и попытка использовать Is для любых целей, кроме проверки ссылочного равенства или недействительности.

(*) Типы, как правило, перегружают равенство только для сравнения с самими собой, но для типов может быть полезно перегрузить оператор равенства для сравнения с другими конкретными типами; например, int может иметь (и IMHO должен был, но не имел) определять операторы равенства для сравнения с float, так что 16777217 не будет сообщать о себе равным 16777216f. Как таковой, поскольку такой оператор не определен, C # будет повышать int до float, округляя его до 16777216f, прежде чем оператор проверки равенства увидит его; Затем этот оператор видит два одинаковых числа с плавающей запятой и сообщает о них как о равных, не подозревая о том, что имело место округление.

0 голосов
/ 20 марта 2014

Когда мы создаем какой-либо объект, объект состоит из двух частей, одна из которых является контентом, а другая - ссылкой на этот контент. == сравнивает и содержание, и ссылку; equals() сравнивает только содержимое

http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq

0 голосов
/ 15 апреля 2015

Действительно отличные ответы и примеры!

Я просто хотел бы добавить фундаментальную разницу между ними,

Операторы, такие как ==, не являются полиморфными, а Equals -

Имея в виду эту концепцию, если вы отработаете какой-либо пример (взглянув на левый и правый ссылочный тип и проверив / узнав, действительно ли в типе перегружен оператор == и равно ли он переопределен), вы обязательно получите правильный ответ.

0 голосов
/ 15 ноября 2014

==

Оператор == можно использовать для сравнения двух переменных любого типа, а он просто сравнивает биты .

int a = 3;
byte b = 3;
if (a == b) { // true }

Примечание: в левой части int больше нулей, но нас это не волнует.

int a (00000011) == байт b (00000011)

Помните == оператор заботится только о структуре битов в переменной.

Использовать == Если две ссылки (примитивы) ссылаются на один и тот же объект в куче.

Правила одинаковы, независимо от того, является ли переменная ссылочной или примитивной.

Foo a = new Foo();
Foo b = new Foo();
Foo c = a;

if (a == b) { // false }
if (a == c) { // true }
if (b == c) { // false }

a == c верно a == b неверно

битовые комбинации одинаковы для a и c, поэтому они равны, используя ==.

Ровный ():

Используйте метод equals (), чтобы увидеть , если два разных объекта равны .

Например, два разных объекта String, которые оба представляют символы в «Джейн»

0 голосов
/ 30 декабря 2014

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

объект: Равно: побитовое равенство ==: ссылочный равенство

строка: (равно и == одинаковы для строки, но если одна из строк изменилась на объект, результат сравнения будет другим) Равно: побитовое равенство ==: битовое равенство

См. здесь для более подробного объяснения.

...