为什么我需要重写C#中的.Equals和GetHashCode

本文关键字:中的 Equals GetHashCode 重写 为什么 | 更新日期: 2023-09-27 18:27:16

我使用的是实体框架5。在我的C#代码中,我想比较两个对象是否相等。如果没有,那么我想发布一个更新。

有人告诉我,我需要重写.Equals方法,然后还要重写gethascode方法。我的课程是这样的:

public class Students    {
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age {get; set;} 
}

有人能解释我为什么需要重写.Equals和.GetHashCode吗?还有人能给我一个例子吗。特别是,我不确定哈希代码。请注意,我的PersonId是这个类的唯一编号。

为什么我需要重写C#中的.Equals和GetHashCode

由于多种原因,您需要重写这两个方法。例如,GetHashCode用于在DictionaryHashTable中进行插入和查找。Equals方法用于对象上的任何相等性测试。例如:

public partial class myClass
{
  public override bool Equals(object obj)
  {
     return base.Equals(obj);
  }
  public override int GetHashCode()
  {
     return base.GetHashCode();
  }
}

对于GetHashCode,我会做:

  public int GetHashCode()
  {
     return PersonId.GetHashCode() ^ 
            Name.GetHashCode() ^ 
            Age.GetHashCode();
  }

如果覆盖GetHashCode方法,也应该覆盖Equals,反之亦然。如果在测试两个对象是否相等时,重写的Equals方法返回true,则重写的GetHashCode方法必须为这两个对象返回相同的值。

类是引用类型。当您创建两个对象并将它们存储在变量中时,您只存储对它们的引用。这意味着,如果您尝试比较它们,您将只比较两个引用,只有当它们指向堆上的同一对象时,这两个引用才会相等。如果您想更改该行为,则必须覆盖Equals
此外,一些集合依赖于GetHashCode以树状(或任何其他)结构存储元素,这些结构需要在给定类的两个对象之间进行某种比较。这就是为什么如果您需要定义的类在指定的环境下正确地运行,就需要实现这些方法
GetHashCode的一个典型实现是类字段的xor,它在@No Idea For Name的答案中给出。但是由于PersonId在您的示例中是唯一的,您也可以使用它:

public int GetHashCode()
{
   return PersonId.GetHashCode();
}