Необходимо ли переопределять операторы == и != при переопределении метода Equals?(.NET)
-
10-07-2019 - |
Вопрос
Или это целесообразно сделать?Почему?
Решение
Посмотрите на рекомендации по переопределению 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.