Необходимо ли переопределять операторы == и != при переопределении метода Equals?(.NET)

StackOverflow https://stackoverflow.com/questions/1222035

Вопрос

Или это целесообразно сделать?Почему?

Это было полезно?

Решение

Посмотрите на рекомендации по переопределению Equals() и operator==.

Цитата:

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

В основном:

Если вы хотите == и != вести себя как Equals(..) и !Equals(..) вам нужно реализовать операторы.Обычно вы делаете это только с неизменяемыми типами.

Другие советы

См. рекомендации по реализации равенств и оператора равенства ( ==)

Для типов значений (структур) " Implement == каждый раз, когда вы переопределяете метод Equals "

Для ссылочных типов (классов), " Большинство ссылочных типов, даже те, которые реализуют метод Equals, не должны переопределять ==. " Исключение составляют неизменяемые классы и классы со семантикой, подобной значениям.

В дополнение ко всем ответам, уже приведенным здесь, не забудьте убедиться, что GetHashCode () также соответствует.

Если вы переопределяете метод equals и по-прежнему хотите иметь возможность проверять равенство (или неравенство), то вам, вероятно, следует также переопределить методы == и! =.

Это было бы целесообразно, так как это было бы неожиданно, если:

if (foo == bar)

... по-другому вел себя по отношению к:

if (foo.Equals(bar))

Это не обязательно, никто не убьет вас, если вы этого не сделаете.

Тем не менее, обратите внимание, что писать (A == B) часто более естественно, чем A.Equals (B). Если вы предоставите оба метода, потребителям вашего кода будет легче.

в A.Equals (B) A не может быть нулевым в A == B либо может быть нулевым

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

Если люди хотят проверять экземпляры ваших классов на равенство значений, то, конечно же, они должны просто вызывать Equals, сохраняя == для проверки равенства ссылок.

Это не обязательно, но умная вещь.

Если вы создаете фреймворк, а другой разработчик, кроме того, который вы собираетесь использовать, вы должны переопределить == и! =. Таким образом, когда разработчик может использовать его, он, по крайней мере, имеет правильную логику для сравнения двух объектов, а не просто одинаковых в памяти.

Я бы позаботился о том, чтобы ваши == & amp; ! = вызывайте ваш метод equals.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top