C#的GetHashCode和Equals方法是什么?为什么需要同时重写它们?

来源:这里教程网 时间:2026-02-21 17:31:06 作者:

在C#中,GetHashCodeEquals 是定义在 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,两个新对象哈希码不同或比较失败,查不到数据。

基本上就这些。只要你在业务中把对象当值来比较,尤其是放进哈希集合,就必须同时重写这两个方法,保证逻辑一致。不复杂但容易忽略。

相关推荐

热文推荐