在覆盖Equals方法时是否有必要覆盖==和!=运算符? (。净)

时间:2009-08-03 12:20:31

标签: .net operators override equals-operator

或者这样做是明智的吗? 为什么呢?

9 个答案:

答案 0 :(得分:26)

请参阅guidelines for overriding Equals() and operator==

引用:

  

默认情况下,operator ==通过确定两个引用是否指示同一对象来测试引用相等性。因此,引用类型不必实现operator ==以获得此功能。当一个类型是不可变的,也就是说,实例中包含的数据不能改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,它们可以被认为是相同的因为它们具有相同的价值。在非不可变类型中覆盖operator ==不是一个好主意。

基本上:

如果您希望==和!=的行为类似于Equals(..)!Equals(..),则需要实现运算符。您通常只使用不可变类型执行此操作。

答案 1 :(得分:5)

请参阅Guidelines for Implementing Equals and the Equality Operator (==)

对于值类型(结构)“实现==任何时候覆盖Equals方法”

对于引用类型(类),“大多数引用类型,即使是那些实现Equals方法的类型,也不应该覆盖==。”例外情况是不可变类和具有类似语义的类。

答案 2 :(得分:2)

除了此处已有的所有答案外,请不要忘记确保GetHashCode()也一致。

答案 3 :(得分:1)

如果要覆盖equals方法并且仍然希望能够检查相等性(或不等式),那么您应该覆盖==和!=方法。

答案 4 :(得分:1)

没有必要,但要聪明一点。

如果您要创建一个框架而另一个开发人员,除了您要使用该对象,您应该覆盖==和!=。这样,当开发人员可以使用它时,他们至少有正确的逻辑来比较2个对象而不是在内存中是相同的。

我会确保你的==& !=调用你的equals方法。

答案 5 :(得分:1)

这是可取的,因为如果出现这种情况会出乎意料:

if (foo == bar)

......表现得与以下不同:

if (foo.Equals(bar))

答案 6 :(得分:1)

没有必要,如果你不这样做,没有人会杀了你。

然而,请注意,写入(A == B)通常比A.Equals(B)更自然。如果您提供这两种方法,则代码的使用者将更容易。

答案 7 :(得分:1)

A.Equals中的

(B)A不能为空 在A == B中,可以为null

答案 8 :(得分:1)

覆盖==使其调用Equals对我来说是一个通常不好的参考类型。如果你重写==使它调用Equals,那么我认为你的代码用户没有办法测试两个对象引用是否引用完全相同的对象(相对于具有相同属性的对象)。

如果人们想要测试类的实例以获得值相等,那么他们肯定应该调用Equals,保存==以专门测试引用相等。