我正在使用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是此类的唯一编号。
答案 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();
}