Является ли == ярлык для метода Equal ()? - PullRequest
3 голосов
/ 22 февраля 2011

На языке Java, я думаю, что при сравнении, например Object1 == Object2;, по умолчанию сравнивается хэш-код объекта. За исключением случаев, когда вы переписываете метод equal (), потому что компаратор == является своего рода ярлыком для равного метод. Пожалуйста, поправьте меня, если я ошибаюсь!

Вопрос в том, То же самое в C #?

Ответы [ 5 ]

8 голосов
/ 22 февраля 2011

В C # == никогда напрямую не вызывает x.Equals(y) (за исключением, возможно, если вы включите string.Equals(x,y)):

  • для некоторых встроенных типов выполняется прямое сравнение (int си т.д. имеют код операции)
  • , если определен явный оператор ==, который называется
  • для Nullable<T>, применяются «поднятые» правила, затем == применяется кзначения, если оба не равны NULL
  • для классов, по умолчанию используется равенство ссылок
  • для структур, по умолчанию == реализация
отсутствует
3 голосов
/ 22 февраля 2011

По умолчанию оператор == проверяет равенство ссылок, определяя, указывают ли две ссылки на один и тот же объект, поэтому ссылочные типы не должны реализовывать operator == для получения этой функциональности.Когда тип является неизменяемым, то есть данные, содержащиеся в экземпляре, не могут быть изменены, может быть полезен оператор перегрузки == для сравнения равенства значений вместо ссылочного равенства, поскольку в качестве неизменяемых объектов их можно считать одинаковыми, если они имеюттакое же значение.Переопределение оператора == в неизменяемых типах не рекомендуется.

Equals - это виртуальный метод, позволяющий любому классу переопределить свою реализацию.Любой класс, представляющий значение, по существу, любой тип значения или набор значений в виде группы, такой как класс комплексных чисел, должен переопределять Equals.Если тип реализует IComparable, он должен переопределить Equals.

2 голосов
/ 22 февраля 2011

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

В C # == делает то же самое с одним важным отличием - в C # возможна перегрузка ==, поэтому можно определить новое значение для оператора. Например, строка == сравнивает содержимое строки с другой.

1 голос
/ 22 февраля 2011

В Java, а также в C # оператор == используется для сравнения ссылок, когда метод Equals () сравнивает значения.

0 голосов
/ 22 февраля 2011

Нет, это не то же самое.obj1 == obj2 имеет значение true, если обе ссылки указывают на один и тот же объект.Но, например, если это 2 разных строковых объекта, которые содержат одинаковое содержимое, это будет false.

Пример:

object obj1 = new Something(123);  
object obj2 = new Something(123);

=> obj1 != obj2
...