C# Dictionary, GetHashCode(), Equals() 的协作关系

GetHasCode() 和 Equals() 是 Object (泛指所有的引用类型) 的两个函数,它们和 Dictionary<Object, Value> 之间是这样协作的: 

 

已知一个已 Object 为主键的 Dictionary<Object, Value>, 当加入一对键值的时候

  1. GetHashCode()会被调用。用于配对是否有相同的键值存在于 Dictionary<Object, Value>
  2. 如果有相同的 hash code, Equals()会被调用, 判断具有相同 Hash Code 的 Object是否相同

 

以下是通过代码来说明以上的叙述

首先创建一个类 MyObject, 并且在类里面重写了GetHashCode() 和 Equals()

C# Dictionary, GetHashCode(), Equals() 的协作关系

PrepareData() 准备了需要加入 Dictionary<object, double> 的数据

C# Dictionary, GetHashCode(), Equals() 的协作关系

当运行 CreateDictionary(List<object> objects, List<double> values) 时候, 每次往Dictionary<object, double> 加入键值对,GetHashCode()会被调用, 由于每次都返回 100, Equals()都会被调用去检验两个 object 是否相同, 但由于 object 本身是不相同的, 所以键值对最后都会被加入Dictionary<object, double>,并且输出结果是 100.

C# Dictionary, GetHashCode(), Equals() 的协作关系

我们可以通过 Call Stack 来看看运行时候 的情况, 也可以设置断点。

C# Dictionary, GetHashCode(), Equals() 的协作关系

 

结果

 

C# Dictionary, GetHashCode(), Equals() 的协作关系