Мне нужны рекомендации по передовому опыту реализации равенства в модели предметной области. На мой взгляд, существует три (3) типа равенства:
Ссылочное равенство - это означает, что оба объекта хранятся в одном и том же пространстве физической памяти.
Identity Equality - это означает, что оба объекта имеют одинаковое значение идентичности. Например, два объекта Order с одинаковым номером заказа представляют одну и ту же сущность. Это особенно важно при хранении значений в списках, хэш-таблицах и т. Д., И объекту требуется уникальный идентификатор для поиска.
Равенство ценностей - оба объекта имеют одинаковые свойства.
По соглашению .NET предоставляет два (2) способа проверки равенства: Equals и ==. Итак, как нам сопоставить три (3) типа с двумя (2) методами?
Я, конечно, исключил Object.ReferenceEquals, который MS добавила в знак признания того, что большинство людей переопределяли Equals, потому что ссылочное равенство не было их желаемым поведением. Так что, может быть, мы сможем вычеркнуть первый тип (?).
Учитывая поведение GetHashCode и Equals в контексте хэш-таблицы, можно ли с уверенностью сказать, что Equals всегда должен обеспечивать Identity Equality? Если да, то как мы можем предоставить вызывающим абонентам способ проверки равенства ценностей?
И разве большинство разработчиков не думают, что Equals и == дадут одинаковый результат? Поскольку == проверяет ссылочное равенство, означает ли это, что мы также должны перегружать == при переопределении Equals?
Твои мысли?
ОБНОВЛЕНИЕ
Я не знаю всех деталей, но мне сообщили (в личной беседе с коллегой), что WPF имеет строгие требования, согласно которым объекты с привязкой к данным используют ссылочное равенство для Equals или привязка данных работает некорректно.
Кроме того, если посмотреть на типичные классы Assert, семантика еще более запутанная. AreEqual (a, b) обычно использует метод Equals, подразумевающий Identity или Value Equality, в то время как AreSame (a, b) использует ReferenceEquals для ссылочного равенства.
Equals()
, а неReferenceEquals()
или==
для обеспечения равенства. Ссылка 1 Ссылка 2. Может быть, ваш коллега изменил методEquals()
в классе, чтобы он работал в одну сторону, изменил данные, ожидал обновления привязки данных, но этого не произошло, потому чтоEquals()
по-прежнему вернул истину? - person Johannes Kommer   schedule 03.11.2011