Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 如果在重写Equals()时未能重写GetHashCode(),会出现什么问题?_C#_.net - Fatal编程技术网

C# 如果在重写Equals()时未能重写GetHashCode(),会出现什么问题?

C# 如果在重写Equals()时未能重写GetHashCode(),会出现什么问题?,c#,.net,C#,.net,可能重复: 在C#中,如果在重写Equals()时未能重写GetHashCode(),具体会出现什么问题 最明显的方法是映射结构 任何这样做的类在用作字典或哈希表的键时都会有不可预测的行为。原因是实现同时使用GetHashCode和Equals在表中正确查找值。该算法的简短版本如下 取HashCode的模数乘以bucket的数量,这就是bucket索引 为指定的键和特定存储桶中的每个键调用.Equals() 如果存在作为值的匹配项,则无匹配=无值 未能保持GetHashCode和Equals同

可能重复:


在C#中,如果在重写Equals()时未能重写GetHashCode(),具体会出现什么问题

最明显的方法是映射结构

任何这样做的类在用作字典或哈希表的键时都会有不可预测的行为。原因是实现同时使用GetHashCode和Equals在表中正确查找值。该算法的简短版本如下

  • 取HashCode的模数乘以bucket的数量,这就是bucket索引
  • 为指定的键和特定存储桶中的每个键调用.Equals()
  • 如果存在作为值的匹配项,则无匹配=无值

  • 未能保持GetHashCode和Equals同步将完全破坏此算法(以及许多其他算法)。

    如果不重写
    GetHashCode
    ,任何比较对象的操作都可能出错

    正如文件所述,如果两个实例相等,则
    GetHashCode
    必须返回相同的值,那么任何希望测试它们是否相等的代码都有权使用
    GetHashCode
    作为对可能相等的组对象的第一次传递(因为它知道具有不同哈希代码的对象不能相等)。如果您的
    GetHashCode
    方法为相等的对象返回不同的值,那么它们可能在第一次传递时进入不同的组,并且永远不会使用它们的
    Equals
    方法进行比较

    这可能会影响任何集合类型的数据结构,但在基于哈希代码的数据结构(如字典和哈希集)中尤其有问题


    简而言之:当您重写
    Equals
    时,始终重写
    GetHashCode
    ,并确保它们的实现是一致的。

    任何使用该键的算法都将无法工作,假设它依赖于散列键的预期行为


    两个
    相等的对象应该具有相同的哈希键值,默认实现无法远程保证这一点。

    将哈希/字典结构视为一个编号桶的集合。如果总是将内容放在与其GetHashCode()对应的bucket中,则只需搜索一个bucket(使用Equals())即可查看是否存在内容。只要你找对了方向,这就行了


    因此,规则是:如果Equals()表示两个对象相等(),则它们必须具有相同的GetHashCode()。

    实现如何确定要使用多少个bucket?这是一个固定值吗?我认为更简单的说法是使用散列码来避免比较,而不是按照编号的桶来考虑。如果已知对象X的hashcode(无论以何种方式)与对象Y的hashcode不匹配,则无需对它们进行任何其他比较。bucket为代码提供了一种简单的方法,可以忽略哈希代码不可能等于某个特定值的项,但许多集合会显式比较哈希代码,即使是排序到同一个bucket中的项也是如此。Jared Parsons的博客对实现相等以及GetHashCode如此重要的原因有很好的解释。