还是建议这样做?为什么?
9 回答
请参阅覆盖 Equals() 和 operator== 的指南。
引用:
默认情况下,运算符 == 通过确定两个引用是否指示同一个对象来测试引用是否相等。因此,引用类型不必实现 operator == 即可获得此功能。当类型是不可变的,即实例中包含的数据不能更改时,重载运算符 == 来比较值相等而不是引用相等可能很有用,因为作为不可变对象,它们可以被视为与 long 相同因为它们具有相同的价值。在非不可变类型中覆盖 operator == 不是一个好主意。
基本上:
如果您希望 == 和 != 表现得像Equals(..)
并且!Equals(..)
您需要实现运算符。您通常只对不可变类型执行此操作。
对于值类型(结构)“在任何时候覆盖 Equals 方法时实现 ==”
对于引用类型(类),“大多数引用类型,即使是那些实现 Equals 方法的引用类型,也不应该覆盖 ==。” 不可变类和具有类值语义的类除外。
除了这里已经给出的所有答案之外,不要忘记确保GetHashCode()
也是一致的。
如果您正在覆盖 equals 方法并且仍然希望能够检查是否相等(或不等式),那么您可能也应该覆盖 == 和 != 方法。
这不是必需的,而是明智的做法。
如果您正在创建一个框架和另一个开发人员而不是您要使用该对象,您应该覆盖 == 和 !=。这样,当开发人员可以使用它时,他们至少有正确的逻辑来比较 2 个对象,而不仅仅是在内存中相同。
我会确保你的 == & != 确实调用你的 equals 方法。
这是可取的,因为如果出现以下情况,这将是出乎意料的:
if (foo == bar)
...表现不同:
if (foo.Equals(bar))
没有必要,如果你不这样做,没有人会杀了你。
但是,请注意,写 (A == B) 通常比写 A.Equals(B) 更自然。如果您同时提供这两种方法,您的代码的使用者会更容易。
在 A.Equals(B) 中 A 不能为空 在 A == B 中也可以为空
覆盖 == 使其调用 Equals 让我觉得对于引用类型来说通常是个坏主意。如果您覆盖 == 以使其调用 Equals,那么我认为您的代码用户没有办法测试两个对象引用是否引用完全相同的对象(相对于具有相等属性的对象)。
如果人们想测试你的类实例的值相等,那么他们当然应该调用 Equals,保存 == 来专门测试引用相等。