Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.NET类中何时需要重写Equals()?_.net_Equality - Fatal编程技术网

在.NET类中何时需要重写Equals()?

在.NET类中何时需要重写Equals()?,.net,equality,.net,Equality,.NET包含它自己的相等比较功能,但是我并不真正理解它是如何工作的 如果所需的Equals()和=行为是验证一个对象的每个字段都等于另一个对象的每个字段,那么有必要使用显式重写Equals()的方法吗?如果您使用的是类,那么是的,这是必要的 对于引用类型(类),.NET在默认情况下提供了一个相等比较,用于比较引用本身,而不是类内的值。如果需要逐字段比较,则需要重写等于 对于结构(值类型),默认比较是逐字段比较 发件人: Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。引用相等是

.NET包含它自己的相等比较功能,但是我并不真正理解它是如何工作的


如果所需的Equals()和
=
行为是验证一个对象的每个字段都等于另一个对象的每个字段,那么有必要使用显式重写Equals()的方法吗?

如果您使用的是类,那么是的,这是必要的

对于引用类型(类),.NET在默认情况下提供了一个相等比较,用于比较引用本身,而不是类内的值。如果需要逐字段比较,则需要重写等于

对于结构(值类型),默认比较是逐字段比较

发件人:

Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。引用相等是指被比较的对象引用引用同一对象。按位相等意味着被比较的对象具有相同的二进制表示


你很少需要这样做

类的默认行为是使用ReferenceEquality:只有当两个引用指向完全相同的实例时,它们才相等。这对于业务对象来说是一个很好的匹配,它们通常与现实世界中的一个对象匹配,并且您不希望重复


也有例外,String类就是一个显著的例子。两个字符串上的相等值将逐个字符进行比较。但请注意,字符串的预期行为是值类型,字符串没有“标识”。

正如文档所示,按位不是完全“按字段”-如果我有一个包含引用类型的结构,默认的Equals()将使用引用相等,即使引用的类型重写了Equals()。可能还值得注意的是,如果重写
Equals
,通常也应该重写
GetHashCode()