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