是否有必要重写==和!=重写Equals方法时,运营商? (。净)
-
10-07-2019 - |
题
或者它的最好这样做呢? 为什么呢?
解决方案
请参阅用于覆盖等于)准则(与运算符==
引用:
默认情况下,操作者==通过确定两个引用是否表示相同的对象为参考相等测试。因此,引用类型没有实现,以获得此功能的==操作符。当类型是不可变的,即,包含在该实例中的数据不能被改变,重载运算符==比较值相等的,而不是参考平等可以是有用的,因为,作为不可变对象,它们可以被认为是相同的,只要因为它们具有相同的价值。它不覆盖操作符==在非恒定类型是个好主意。
基本上:
如果你想==和!=表现得像Equals(..)
和!Equals(..)
需要实现运营商。您通常这样做只有稳定的类型。
其他提示
有关值类型(结构)“实现==任何时候重写Equals方法”
有关引用类型(类),“大多数引用类型,即使是那些实施Equals方法,不应该重写==”。唯一的例外是对不可变的类和那些值样的语义。
在除了所有的答案已经在这里,不要忘记,以确保GetHashCode()
是一致的为好。
如果要覆盖equals方法,并仍然希望能够检查是否相等(或不相等),那么你或许应该重写==和!=方法为好。
这将是可取的,因为这将是意想不到的,如果:
if (foo == bar)
...表现不同为:
if (foo.Equals(bar))
这是没有必要,没有人会杀了你,如果你不这样做。
但是,请注意,它常常是更自然写(A == B)比A.Equals(B)。如果你提供了这两种方法,这将是消费者你的代码更容易。
在A.Equals(B)不能为空 在A ==乙或者可以为空
重载==使其打电话的Equals令我引用类型通常坏主意。如果重写==让它叫平等相待,那么我不认为有对你的代码的用户的方式来测试两个对象的引用是否指向完全相同的对象(与具有相同属性的对象)。
如果人们想测试你的类的实例的值相等那么肯定他们应该叫平等相待,节省==进行专门测试参考平等。
这是没有必要的,但一个聪明的做法。
如果你正在创建一个框架,其他比你要使用的对象,你应该重写==和另一家开发商!=。这样,当一个开发者可以使用它,他们至少有合适的逻辑,比较2个对象,而不是仅仅是在存储器中的相同。
我将确保您的==!=不打电话给你的equals方法。