在 C# 中,Dictionary 是如何判断键是否相等的?请说明其默认的相等性比较机制以及如何自定义键的相等性判断。
考察说明
考查对 C# Dictionary 键相等性判断机制的理解,包括默认比较器和自定义比较器。
回答思路
- 【回答框架 1】Dictionary 使用键的哈希码和相等性比较来确定键的唯一性。默认情况下,它使用 EqualityComparer<T>.Default,该比较器调用键类型的 GetHashCode 和 Equals 方法。
- 【回答框架 2】对于引用类型,默认的 Equals 比较引用相等性,GetHashCode 基于对象引用;对于值类型,默认比较字段值。若键类型未重写这些方法,则按默认规则判断。
- 【回答框架 3】自定义相等性判断可通过实现 IEqualityComparer<T> 接口并传递给 Dictionary 构造函数,或重写键类型的 GetHashCode 和 Equals 方法。
- 【回答框架 4】哈希码用于快速定位桶,相等性比较用于处理哈希冲突,确保键唯一。因此,GetHashCode 和 Equals 必须一致,即相等的键必须有相同的哈希码。
- 【回答框架 5】在自定义比较器时,需确保比较器是确定性的且不随状态变化,否则可能导致字典行为异常。
- 【关键点 1】默认使用 EqualityComparer<T>.Default,依赖键类型的 GetHashCode 和 Equals。
- 【关键点 2】引用类型默认比较引用,值类型默认比较字段值。
- 【关键点 3】可通过实现 IEqualityComparer<T> 或重写 GetHashCode/Equals 自定义相等性。
- 【关键点 4】相等的键必须具有相同的哈希码,否则字典无法正确工作。
- 【易错点 1】重写 Equals 但未重写 GetHashCode,导致哈希码不一致,字典查找失败。
- 【易错点 2】自定义比较器时,比较器状态变化导致哈希码变化,破坏字典的稳定性。
- 【易错点 3】误以为 Dictionary 保证插入顺序,实际不保证,但相等性判断与顺序无关。