9

根据MSDN大多数引用类型不得重载相等运算符,即使它们覆盖 Equals。但是,如果您正在实现旨在具有值语义的引用类型,例如复数类型,则必须覆盖相等运算符。

为像 Customer 这样的典型域实体实现equals方法和相等运算符的最佳实践是什么?

如果两个实体的身份相同,它是否应该实现equals方法以返回true ?如果实体不是不可变的怎么办?如果两个实体都是新实体并且它们的标识具有空值怎么办。那么相等运算符呢?

正如JaredPar在这里 提到的, Equals 实际上将测量值的相等性,而 == 将测量它们是否是相同的参考。

4

2 回答 2

5

来自MSDN

大多数引用类型不能重载相等运算符,即使它们重写了 Equals。但是,如果您正在实现旨在具有值语义的引用类型,例如复数类型,则必须覆盖相等运算符。

Microsoft 认为 == 应该只用于类似值的类型,例如数字类型,如ComplexBigInt。复合类型如Person不应覆盖相等运算符。这是代码风格的问题,Microsoft 建议您遵循此准则。我怀疑编译的结果会有很大不同。

于 2011-11-10T07:39:48.090 回答
3

通常我不会为我的类实现(= 运算符或 Equals(),例如 Customer)。

您绝对不应该重写 = 运算符,因为使用您的类的开发人员期望 = 来比较指针而不是实例本身,更改此行为只会导致错误,因为人们不希望它以这种方式工作。

如果您想包含一种进行语义比较的方法,这就是 Equals() 方法的用途,并且您可以覆盖它以以任何对您希望如何在代码中使用它有意义的方式来实现相等检查。

于 2011-11-10T07:35:36.383 回答