c# - .NET 的 Equals 方法的真正含义是什么?

标签 c# .net

我们知道所有类型都从它们的基类 Object 继承 Equals。

根据微软文档:

Equals returns true only if the items being compared refer to the same item in memory.

所以我们使用 Equals() 来比较对象引用,而不是对象的状态。

Typically, this method is overridden to return true only if the objects being compared have the same internal state values.

我的问题:两个对象是否可以指向内存中的同一项但具有不同的状态?如果不是,为什么要覆盖 Equals?


感谢您提供明确的答案。对于 future 的读者,这里有一个我们重写原因的例子:

Employee A=New Employee();
Employee B=New Employee();

在这种情况下,A 和 B 始终指向不同的内存,因此 Equals 始终为假。

但是如果:

A.SSN=B.SSN;
A.LiceneNumber=B.LiceneNumber;

这两个 Employees 是同一个人,在这种情况下,我们需要检查状态并因此覆盖 Equals。

所以在我的例子中,问题的重点是:两个不同的对象可能存储在两个不同的位置,但仍然引用同一个实体(在我的例子中是 Employee)。

最佳答案

Can 2 object point to the same item in memory but have different states?

这误解了对象与变量或引用之间的区别。 “内存中的项目”是对象,它所说的“状态”是用来保存对象的内存。您使用变量引用对象。提出这个问题的正确方法如下(区别确实很重要,因为它是深入了解 C# 和类似语言工作原理的关键):

Can two variables refer to the same object in memory but have different states?

要回答这个问题,您可以让两个变量引用内存中的同一个对象...但它确实是同一个对象。内存中只有一项(它是对象),这意味着只有一种状态。

但这给我们带来了这个问题:

why override Equals?

您重写了 Equals() 方法,因为有时您有两个变量引用两个不同的对象,而这两个对象具有相同的值。例如,我可以像这样创建两个字符串对象:

string a = "hello world";
string b = "hello world";

暂时忽略字符串驻留,这两个变量引用内存中的两个不同字符串对象。从 Object 继承的基本 Equals() 实现将导致 false,但字符串类型重载了 Equals() 方法进行值比较,因此 a.Equals(b) 将导致 true

最后,我们知道的足以回答这个问题:

Is it possible for two different objects stored in two different locations to still refer to same Entity?

是的,是的。这也是我们重载 Equals() 方法(以及 GetHashCode())的原因。从 Object 继承的基本 Equals() 方法会将它们视为两个不同的对象,结果将为 false。您为类型覆盖了 Equals(),这样当两个对象表示相同的值时它可以返回 true

现在开始变得棘手了。一个应用程序可能会以 同一个人 的 Employee 类型的两个实例结束,然后用户仅更改其中一个的电子邮件地址属性。现在你有两个实例。对于同一个员工。 某些字段具有不同的值。

您希望 Equals() 做什么?仔细考虑一下;多年来,它一直是许多应用程序中许多错误的来源。有时您需要一种方式。有时你需要另一个。有时,行为需要根据同一应用程序中的上下文 进行更改。

关于c# - .NET 的 Equals 方法的真正含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52951598/

相关文章:

c# - 确定哪个对象的瓦片被接管

c# - 如何从 aspx 引用 cs 中的常量?

c# - 在 4.0 项目中引用 .net Framework 4.5.1 程序集

C# .NET 使用 HttpWebRequest 将文件上传到 Web 表单

c# - 异常读取进程信息,通过 Process.GetProcesses(string),从 Windows 7

c# - Windows 身份验证是否使用 aspnet_Users 表?

c# - access中插入记录到数据库后如何获取最后一条记录号

.net - .NET 中的 .resx 和 .config 文件有什么区别?

.net - 如何从 PHP 使用 WCF Web 服务?

c# - AD 获取具有继承成员资格的组中的用户