来自框架设计指南:
不要在可变引用类型上实现值相等。 [P-270]
来自Eric Evans的DDD:
每个ENTITY必须具有与另一个对象建立其身份的操作方式。 [P-94]
我是否应将重写Object.Equals方法视为标识操作或仅比较Identity属性(例如customer1.Id == customer2.Id)?
答案 0 :(得分:7)
您可能希望能够区分三种情况。
您有两个对同一实体的引用。在这种情况下,正常的相等运算符将正确地完成其工作。无需覆盖任何内容。
您在同一实体的内存中有两个实例。当您正确设计存储库时,这种情况是可以避免的,但有时这是您必须使用的情况。您的customer1.Id == customer2.Id示例在这种情况下可以正常工作。
您有两个不同的实体,但您想知道它们是否具有相似的属性值。这可能是代码味道。您可能将值类型视为实体。如果您真的想要这样做,那么您应该从正常的.net ==和.Equals机制中单独实现它。 (例如.IsSameAs(客户主题))以避免混淆。
答案 1 :(得分:1)
如果你考虑重写Object.Equals,你必须记住你还要覆盖GetHashCode()。