为什么我需要在C#中覆盖.Equals和GetHashCode

时间:2013-08-11 04:36:32

标签: c#

我正在使用Entity Framework 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是此类的唯一编号。

2 个答案:

答案 0 :(得分:3)

由于各种原因,你需要覆盖这两个原因。例如,HashCode用于字典和hashTable。 equals用于您对数据结构(如Contains方法)进行的任何比较。一个例子:

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

  public override int GetHashCode()
  {
     return base.GetHashCode();
  }
}
对于哈希码我会做的

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

答案 1 :(得分:1)

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

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