为什么我需要重写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是这个类的唯一编号。
由于多种原因,您需要重写这两个方法。例如,GetHashCode
用于在Dictionary
和HashTable
中进行插入和查找。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();
}