我们知道所有类型都从其基类Object继承Equals。
根据Microsoft文档:
因此,我们使用Equals()来比较对象引用,而不是对象的状态。
我的问题:两个对象可以指向内存中的同一项目但状态不同吗?如果不是,为什么要覆盖等于?
感谢您提供的答案,这很清楚。对于以后的读者来说,这是我们为何覆盖的示例:
Employee A=New Employee();
Employee B=New Employee();
在这种情况下,A和B始终指向不同的内存,因此Equals始终为false。
但是,如果:
A.SSN=B.SSN;
A.LiceneNumber=B.LiceneNumber;
这两个雇员是同一个人,在这种情况下,我们需要检查状态并因此覆盖Equals。
因此,在我的情况下,问题的关键是:两个不同的对象可能存储在两个不同的位置,但仍引用同一实体(在我的情况下为Employee)。
最佳答案
这会误解对象与变量或引用之间的区别。 “内存中的项目”是对象,而它所说的“状态”是用于保存对象的内存。您使用变量引用对象。提出此问题的正确方法如下(并且区别确实很重要,因为这是很多有关C#和类似语言如何工作的关键):
要回答这个问题,您可以让两个变量引用内存中的同一对象...,但是实际上它是相同对象。内存中只有一个项目(它是对象),这意味着只有一种状态。
但这使我们想到了这个问题:
您覆盖Equals()
方法,因为有时您有两个变量引用两个不同的对象,而这两个对象具有相同的值。例如,我可以创建两个这样的字符串对象:
string a = "hello world";
string b = "hello world";
暂时忽略字符串插入,这两个变量引用内存中的两个不同的字符串对象。从
Equals()
继承的基本Object
实现将产生false
,但是字符串类型会使Equals()
方法重载以进行值比较,因此a.Equals(b)
会导致true
。最后,我们足够了解这个问题:
是的。同样,这就是为什么我们重载
Equals()
方法(以及GetHashCode()
)的原因。从Equals()
继承的基本Object
方法会将它们视为两个不同的对象,结果将是false
。您可以为类型覆盖Equals()
,以便当两个对象表示相同的值时,它可以返回true
。现在开始变得棘手。一个应用程序可能以同一个人的两个Employee类型的实例结束,然后用户在其中的一个实例上更改电子邮件地址属性。现在您有两个实例。对于同一名员工。其中某些字段具有不同的值。
您想
Equals()
做什么?仔细考虑一下;多年来,它已成为许多应用程序中许多错误的源头。有时您需要一种方式。有时您需要另一个。有时,行为需要根据同一应用程序中的上下文进行更改。关于c# - .NET的Equals方法到底是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52951598/