是否有必要重写==和!=重写Equals方法时,运营商? (。净)(Is it necessar

2019-06-27 15:52发布

或者它的最好这样做呢? 为什么?

Answer 1:

见的忽略equals()的指导方针和运营商== 。

引用:

默认情况下,引用相等操作==测试通过确定是否两个引用表示同一个对象。 因此,引用类型没有实现,以获得此功能的==操作符。 当类型是不可变的,即,包含在该实例中的数据不能被改变,重载运算符==比较值相等的,而不是参考平等可以是有用的,因为,作为不可变对象,它们可以被认为是相同的,只要因为它们具有相同的价值。 它不是重写操作符==在非稳定的类型是个好主意。

基本上:

如果你想==和!=表现得像Equals(..)!Equals(..)你需要实现运营商。 您通常这样做只有稳定的类型。



Answer 2:

见为实现equals和相等运算符准则(==)

对于值类型(结构)“实施==任何时候你重写Equals方法”

对于引用类型(类),“大多数引用类型,即使是那些实现Equals方法,不应该重写==。” 唯一的例外是一成不变的类和那些价值般的语义。



Answer 3:

除了所有的答案已经在这里,不要忘记确保GetHashCode()是一致的为好。



Answer 4:

如果您正在覆盖equals方法,并仍然希望能够检查是否相等(或不相等),那么你或许应该重写==和!=方法为好。



Answer 5:

这将是可取的,因为这将是,如果意外:

if (foo == bar)

......表现不同来:

if (foo.Equals(bar))


Answer 6:

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

但是,请注意,它常常是更自然的书写(A == B)比A.Equals(B)。 如果你提供了这两种方法,这将是消费者你的代码更容易。



Answer 7:

在A.Equals(B)不能为空在A ==乙或者可以为空



Answer 8:

重写==使其打电话的Equals令我引用类型通常坏主意。 如果重写==让它叫平等相待,那么我不认为有对你的代码的用户来测试两个对象的引用是否指的是完全相同的对象(而不是对象具有相同的属性)的方式。

如果人们想测试你的类的实例的值相等那么肯定他们应该叫平等相待,节省==测试参考平等具体。



Answer 9:

这是没有必要的,但一个聪明的做法。

如果你正在创建一个框架,其他比你要使用的对象,你应该重写==和另一家开发商!=。 当开发者可以使用它的方式,他们至少有权利逻辑比较2个对象,而不是仅仅是在内存中的相同。

我将确保您的==!=不打电话给你的equals方法。



文章来源: Is it necessary to override == and != operators when overriding the Equals method? (.NET)