必须同时重写Equals和GetHashCode以确保相等性判断与哈希一致性,例如Person类中按Name和Age比较时,若只重写Equals而未重写GetHashCode会导致Dictionary查找失败。

在C#中,GetHashCode 和 Equals 是定义在 Object 类中的两个方法,用于判断对象是否相等以及支持哈希集合(如 Dictionary、HashSet 等)的高效查找。
Equals 方法的作用
Equals 用于判断两个对象在逻辑上是否“相等”。默认实现是比较引用(即是否指向同一个内存地址),但对值类型或需要按字段比较的类,通常需要重写它来定义“内容相等”。
例如:
public override bool Equals(object obj)
{
if (obj is Person p)
return Name == p.Name && Age == p.Age;
return false;
}
GetHashCode 方法的作用
GetHashCode 返回一个整数,作为对象的哈希码。哈希集合(如 Dictionary 的 key、HashSet)使用这个值快速定位对象。如果两个对象通过 Equals 判断相等,它们的 GetHashCode 必须返回相同的值。
例如:
public override int GetHashCode()
{
return HashCode.Combine(Name, Age);
}
为什么必须同时重写?
只重写其中一个会破坏“相等性契约”,导致哈希集合行为异常。
如果你只重写 Equals 而不重写 GetHashCode,两个逻辑相等的对象可能产生不同的哈希码。这样在 Dictionary 中就找不到原本存入的对象。如果你只重写 GetHashCode 而不重写 Equals,不同对象可能有相同哈希码(哈希碰撞正常),但系统仍会调用 Equals 确认是否真相等。如果不重写,还是用引用比较,结果就不准确。
简单说:Equals 定义“什么算相等”,GetHashCode 提供“快速查找依据”。两者必须保持一致。
实际影响示例
假设你有一个 Person 对象用作 Dictionary 的 key:
var people = new Dictionary();
people.Add(new Person(“Alice”, 25), “Engineer”);
之后想通过一个内容相同的 Person 去取值:
var result = people[new Person(“Alice”, 25)]; // 报错:key not found
原因:即使内容一样,若未重写 GetHashCode 和 Equals,两个新对象哈希码不同或比较失败,查不到数据。
基本上就这些。只要你在业务中把对象当值来比较,尤其是放进哈希集合,就必须同时重写这两个方法,保证逻辑一致。不复杂但容易忽略。
以上就是C#的GetHashCode和Equals方法是什么?为什么需要同时重写它们?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441931.html
微信扫一扫
支付宝扫一扫