Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
C# 何时重写GetHashCode()?_C#_.net - Fatal编程技术网

C# 何时重写GetHashCode()?

C# 何时重写GetHashCode()?,c#,.net,C#,.net,我们应该在什么时候重写“系统””命名空间中的“对象””类提供的GetHashCode()方法?当您重写Equals时,基本上是这样。当您想要提供与简单引用相等不同的相等概念时 String就是一个很好的例子——如果两个字符串代表相同的字符序列,那么它们是相等的(在简单的Equals调用下)。哈希代码反映了这一点,因此,如果两个字符串相等,它们将具有相同的哈希代码。(反过来不一定正确——两个不相等的字符串可以具有相同的哈希代码,但可能性不大。) (请注意,字符串在其他方面是很棘手的-基于区域性和大

我们应该在什么时候重写“系统””命名空间中的“对象””类提供的GetHashCode()方法?

当您重写
Equals
时,基本上是这样。当您想要提供与简单引用相等不同的相等概念时

String就是一个很好的例子——如果两个字符串代表相同的字符序列,那么它们是相等的(在简单的Equals调用下)。哈希代码反映了这一点,因此,如果两个字符串相等,它们将具有相同的哈希代码。(反过来不一定正确——两个不相等的字符串可以具有相同的哈希代码,但可能性不大。)


(请注意,字符串在其他方面是很棘手的-基于区域性和大小写,有很多不同的相等概念,但是
String.Equals
只查看组成字符串的UTF-16代码点,并以最简单的方式进行比较。)

如果覆盖
等于
,则必须同时覆盖
GetHashCode

“GetHashCode方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数,并在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性的值,而不是静态字段或属性

在哈希表对象中用作键的对象也必须重写GetHashCode方法,因为这些对象必须生成自己的哈希代码。如果用作键的对象没有提供GetHashCode的有用实现,则可以在构造Hashtable对象时指定哈希代码提供程序。在.NET Framework 2.0版之前,哈希代码提供程序基于System.Collections.:.IHashCodeProvider接口。从2.0版开始,哈希代码提供程序基于System.Collections.::.IEqualityComparer接口。“


如果您的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),那么您应该编写自己的实例对象重写。Equals().

我的同事和我今天刚刚讨论了这个问题。现在更有意义了。谢谢Jon。假设我有一个点有两个整数来描述坐标。我如何返回一个只有一个整数大的唯一哈希代码?我的结构中的数据越多,得到完全不同的哈希值的机会就越高数据-如果我的一个结构中有7个浮点数(它有相等操作),那么实现它会没有用吗?@PacMani:为什么你需要返回一个唯一的散列码?@JonSkeet:哦,我以为它是用来做一些几乎唯一的事情的。那么它是用来做什么的呢?