2026-06-09 / C# / .NET Core
C# Equals、GetHashCode 与哈希集合语义
解释为什么自定义相等性时必须同时处理 Equals 和 GetHashCode,以及哈希集合如何使用它们。
C#.NET
C# Equals、GetHashCode 与哈希集合语义
如果对象要进入 Dictionary、HashSet 这类结构,就不能只改 Equals 而不改 GetHashCode。
哈希容器通常先用哈希值定位桶,再用相等性确认元素。如果两个逻辑相等的对象哈希值不同,就可能出现查找失败、删除失败或重复元素。
最佳实践
- 自定义值相等时,同时实现
Equals和GetHashCode。 - 作为哈希键的对象最好不可变。
- 不要用随机数或会变化的字段生成哈希值。
- 能用 record 表达值对象时,可以优先考虑 record。