Понимание IEquatable
Если я хочу сравнивать объекты и они реализуют интерфейс IEquatable < > , у меня есть несколько вопросов:
- Почему мне приходится переопределять Equals (object), если мне нужно реализовать Equals < >
- Могу ли я использовать == и!= один раз реализовать IEquatable?
Ответы
Ответ 1
Относительно # 1:
От MSDN:
Если вы реализуете IEquatable<T>
, вы также должны переопределить реализации базового класса Object::Equals(Object)
и GetHashCode()
, так что их поведение в соответствии с IEquatable<T>::Equals
метод. Если вы переопределите Object::Equals(Object)
, ваш переопределенная реализация также вызываемый в вызовах статического Equals(System.Object, System.Object)
метод на вашем классе. Это обеспечивает что все вызовы Equals()
метод возвращает согласованные результаты.
2)
Нет, они делают простые сравнения ссылок и не используют метод Equals.
Ответ 2
1) Как сказал Рэй, переопределите Equals(object)
, чтобы обеспечить согласованность, когда метод вызывается из классов, которые не знают (статически), которые вы реализуете IEquatable<T>
. Например, классы не общих типов будут использовать Equals(object)
для сравнения. Вы также должны переопределить GetHashCode()
.
2) Реализация IEquatable<T>
не перегружает операторы == и!= автоматически, но вам нечего мешать, как это делает System.String
. Однако, если вы это сделаете, вы должны сделать это очень четко, и будьте осторожны, когда вы делаете сравнения между другими типами ссылок (например, MyType и Object), которые по-прежнему будут использовать сравнение идентичности. Я подозреваю, что это не очень хорошая идея, если это не будет очень сильно используемым типом в вашем коде, где все будут очень хорошо знакомы с ним и где синтаксический сахар перегрузки == действительно окажет положительное влияние на читаемость.