【发布时间】:2018-10-23 14:30:44
【问题描述】:
我们知道所有类型都从其基类 Object 继承 Equals。
根据 Microsoft 文档:
只有当被比较的项目引用内存中的相同项目时,Equals 才会返回 true。
所以我们使用 Equals() 来比较对象引用,而不是对象的状态。
通常,仅当被比较的对象具有相同的内部状态值时,此方法才会被覆盖以返回 true。
我的问题:两个对象可以指向内存中的同一个项目但具有不同的状态吗?如果不是,为什么要覆盖 Equals?
感谢您提供明确的答案。对于未来的读者,这里是我们为什么覆盖的示例:
Employee A=New Employee();
Employee B=New Employee();
在这种情况下,A 和 B 始终指向不同的内存,因此 Equals 始终为 false。
但是如果:
A.SSN=B.SSN;
A.LiceneNumber=B.LiceneNumber;
这两个员工是同一个人,在这种情况下,我们需要检查状态并因此覆盖 Equals。
所以在我的例子中,问题的重点是:有可能两个不同的对象存储在两个不同的位置,但仍然引用同一个实体(在我的例子中是 Employee)。
【问题讨论】:
-
您重写 equals 以提供更包容的平等定义,而不是更排他的平等定义。
-
Equals 不仅比较参考。 2 个整数具有不同的引用,但在比较值时返回 true 到 equals。等于都是独立实现的。通常人们会检查相同的引用,如果是则返回 true,否则他们经常逐个检查属性。
-
@Franck 是 Equals() 的一个版本,已经被
int类型重载。从 Object 继承的 Equals() 的基本版本只比较引用。 -
@Franck 两个
int值没有不同的引用,因为它是一个值类型。只有当它们首先通过转换为object进行装箱,然后像乔尔所说的那样,它将使用覆盖的Equals,这才是正确的。