Обычно я пытаюсь следовать за следующим шаблоном:
, Каждая часть (статичный и экземпляр) состоит из следующих типов элемента:
Тогда участники отсортированы по видимости (от меньше до более видимого):
, порядок не является догмой: простые классы легче считать, однако, более сложным классам нужна зависящая от контекста группировка.
Есть три случая, которые вы, возможно, захотите различить.
У вас есть две ссылки на одну и ту же сущность. В этом случае нормальные операторы равенства выполнят свою работу правильно. Не нужно ничего переопределять.
У вас есть два экземпляра в памяти одного и того же объекта. Если вы правильно проектируете свои репозитории, этой ситуации можно избежать, но иногда это ситуация, с которой вам придется работать. Ваш пример customer1.Id == customer2.Id в этом случае будет работать нормально.
У вас есть две разные сущности, но вы хотите знать, имеют ли они одинаковые значения свойств. Это может быть запах кода. Вы можете рассматривать тип значения как объект. Если это действительно то, что вы хотите сделать, вам следует реализовать это отдельно от обычных механизмов .net == и .Equals. (например . IsSameAs (субъект клиента)), чтобы избежать путаницы.
Если вы рассматриваете возможность переопределения Object.Equals, вы должны иметь в виду, что вы также должны переопределить GetHashCode ().