




От Статья MS Docs на IEquatable<T>:
If you implement
IEquatable<T>, you should also override the base class implementations ofEquals(Object)andGetHashCode()so that their behavior is consistent with that of theEquals(T)method. If you do overrideEquals(Object), your overridden implementation is also called in calls to the staticEquals(Object, Object)method on your class. In addition, you should overload theop_Equalityandop_Inequalityoperators. This ensures that all tests for equality return consistent results.
Нет, операторы не используют метод Equals. Для этого они должны быть перегружен отдельно.
Довольно много. Подробнее здесь: msdn.microsoft.com/en-us/library/53k8ybth(VS.80).aspx
Нет, используйте для этого ReferenceEquals (). Оператор равенства (==) обычно означает то же самое, но его можно переопределить (например, для строк и т.п.).
Небольшая поправка к терминологии - операторы отвергать нельзя, но можно перегрузка.
Да, вы можете перегрузить == и! = В и использовать их вместе с интерфейсом IEquatable. Но это нужно делать вручную, это не происходит автоматически с IEquatable. «Нет» во второй части ответа на самом деле неверен. Примечание. Пытался отредактировать ответ, но, по-видимому, некоторые думают, что неправильный ответ с наивысшей оценкой не является достаточной причиной для утверждения исправления.
@AlexKven Готово! Дело не в том, что такое редактирование не следует делать; это то, что вы ожидаете, что рецензенты повторно проведут ваше собственное исследование, чтобы проверить ваши изменения. Иногда они могут даже не быть знакомы с рассматриваемым языком программирования.
1) Как сказал Рэй, переопределите Equals(object), чтобы обеспечить согласованность, когда метод вызывается из классов, которые не знают (статически), что вы реализуете IEquatable<T>. Например, неуниверсальные классы коллекций будут использовать Equals(object) для сравнений. Вы также должны переопределить GetHashCode().
2) Реализация IEquatable<T> не перегружает операторы == и! = Автоматически, но ничто не мешает вам сделать это, как это делает System.String. Однако вы должны четко задокументировать это, если вы это сделаете - и будьте осторожны при сравнении между другими типами ссылок (например, MyType и Object), которые по-прежнему будут использовать сравнение идентичности. Я подозреваю, что это не лучшая идея, если только это не будет очень интенсивно используемым типом в вашем коде, где все будут хорошо знакомы с ним а также, где синтаксический сахар перегрузки == действительно окажет положительное влияние на читаемость.
Джон, есть ли прирост производительности для типа реализации IEquatable <T>, используемого, например, в Collection <T>, вызывающем метод Contains?
Это позволит избежать кастинга, да. Для типов значений он также избегает упаковки и распаковки. См. Документацию для Collection <T> .Contains - он использует EqualityComparer <T> .Default, который будет использовать реализацию IEquatable <T>, если это возможно.
Да, не рекомендуется перегружать operator == и! = Для обеспечения проверки равенства значений (по сравнению с проверкой равенства ссылок по умолчанию). В документации MSDN предлагается делать это только для неизменяемых типов. Также существуют проблемы, связанные с интерфейсами и перегрузкой операторов.
См. stackoverflow.com/questions/728434/… для получения дополнительной информации по обоим вопросам.
поэтому, когда вы имеете дело с объектами, предполагается, что == означает только один и тот же адрес памяти (тот же экземпляр)