我们知道所有类型都从它们的基类继承Equals,即Object.
每个Microsoft文档:
仅当被比较的项目引用内存中的相同项目时,Equals才返回true.
所以我们使用Equals()来比较对象引用,而不是对象的状态.
通常,仅当被比较的对象具有相同的内部状态值时,才会重写此方法以返回true.
我的问题:两个对象可以指向内存中的相同项目但是具有不同的状态吗?如果没有,为什么要覆盖Equals?
感谢您的回答清楚.对于未来的读者,这里是我们覆盖的原因的一个例子:
Employee A=New Employee();
Employee B=New Employee();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,A和B始终指向不同的内存,因此Equals始终为false.
但是如果:
A.SSN=B.SSN;
A.LiceneNumber=B.LiceneNumber;
Run Code Online (Sandbox Code Playgroud)
这两个员工是同一个人,在这种情况下,我们需要检查状态,因此重写Equals.
所以在我的情况下,问题的关键在于:两个不同的对象可能存储在两个不同的位置,但仍然引用同一个实体(在我的例子中是Employee).
Joe*_*orn 12
2对象可以指向内存中的相同项但具有不同的状态吗?
这误解了对象与变量或引用之间的区别."内存中的项目" 是对象,它所谈论的"状态"是用于保存对象的内存.您可以使用变量来引用该对象.问这个问题的正确方法是以下(且差异确实问题,因为它的关键是了解了很多关于C#和类似的语言是如何工作的):
两个变量可以引用内存中的同一个对象但是有不同的状态吗?
要回答这个问题,你可以让两个变量引用内存中的同一个对象......但它确实是同一个对象.内存中只有一个项目(它是对象),这意味着只有一个状态.
但这带来了我们这个问题:
为什么要覆盖Equals?
您重写该Equals()方法,因为有时您有两个变量引用两个不同的对象,其中这两个对象具有相同的值.例如,我可以创建两个这样的字符串对象:
string a = "hello world";
string b = "hello world";
Run Code Online (Sandbox Code Playgroud)
暂时忽略字符串实习,这两个变量引用内存中的两个不同的字符串对象.Equals()继承自的基本实现Object会导致false,但字符串类型会重载Equals()方法以进行值比较,因此a.Equals(b)会导致true.
最后,我们知道足以回答这个问题:
存储在两个不同位置的两个不同对象是否仍然可以引用相同的实体?
是的.这也是我们重载Equals()方法(以及GetHashCode())的原因.Equals()继承自的基本方法Object会将它们视为两个不同的对象,结果将是false.您可以覆盖Equals()类型,以便true在两个对象表示相同值时返回.
现在开始变得棘手了.应用程序最终可能会为同一个人创建两个Employee类型的实例,然后用户只更改其中一个的电子邮件地址属性.现在你有两个实例.对于同一名员工.某些字段具有不同的值.
你想做Equals()什么?仔细想想这个; 多年来,它一直是许多应用程序中许多错误的根源.有时你需要一种方式.有时你需要另一个.有时,行为需要根据同一应用程序中的上下文进行更改.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |