Dictionary <TKey,TValue>什么时候调用TKey.Equals()?

2 .net c# dictionary

只是覆盖EqualsTKey没有帮助.

public override bool Equals(object obj)
{ /* ... */  }
Run Code Online (Sandbox Code Playgroud)

... Equals()永远不会被称为......

Ree*_*sey 8

当您进行字典查找时,这就是事情发生的顺序:

  1. 该字典使用TKey.GetHashCode来计算存储桶的哈希值.
  2. 然后,它使用该存储桶检查所有哈希,并在各个对象上调用Equals,以确定匹配.

如果存储桶永远不匹配(因为GetHashCode没有被覆盖),那么你永远不会调用Equals.这就是为什么你应该总是实现两者的原因之一 - 如果你想在散列集合中使用你的对象,你应该覆盖这两个函数(比调用base.GetHashCode()更有意义).

如果您正在实现一个类,则应该实现一个GetHashCode例程,该例程为Equal的项返回相同的哈希码.理想情况下,您希望尽可能为不相等的项返回不同的哈希代码,因为这将使您的字典查找更快.

您还应该以正确检查相等实例的方式实现Equals.

类(引用类型)的默认实现只是比较引用本身.默认情况下,两个实例具有完全相同的值,并且在Equals上返回false(因为它们具有不同的引用).默认情况下,多个实例始终也会返回不同的哈希代码.