Equals
Equals的作用是比较对象实例是否相等。MSDN中提到,Object默认支持引用相等,如果想要判断值相等,就要重写Equals。判断两个实例是否是一个引用时,通常是通过object.ReferenceEquals(obj1, obj2);来进行。代码示例如下:
public class User
{
private string userName;
private int userAge;public string UserName
{
get { return userName; }
set { userName = value; }
}public int UserAge
{
get { return userAge; }
set { userAge = value; }
}
}
对于User user1=new User() User user2=user1 这时候如果用object.ReferenceEquals(user1,user2)或者user1.Equals(user2),这是显示的结果是true。
对于User user1=new User() User user2=new User() 这时间如果用object.ReferenceEquals或者user1.Equals(user2)来比较,这时显示的结果是false。
虽然user1和user2的值都是一样的,但是指向的内存并不是同一个地方,所以引用比较就为false。如果需要进行值比较,就需要重写Equals方法。下面是重写User的Equals示例:
public class User
{
private string userName;
private int userAge;public string UserName
{
get { return userName; }
set { userName = value; }
}public int UserAge
{
get { return userAge; }
set { userAge = value; }
}
public override bool Equals(object obj)
{
if (obj==null)
{
return false;
}
if (object.ReferenceEquals(this,obj))
{
return true;
}
User user = (User)obj;
return user.UserName == this.UserName && user.UserAge == this.UserAge;
}
}
这是对于上次提到的两种情况,用user1.Equals(user2)的方式来判断,那么结果都是true;
GetHashCode
GetHashCode就是获取这个对象的唯一标示,当你重写Equals时,如果不重写GetHashCode,生成时就会有警告。MSDN中提到:
给实现者的说明 哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。 哈希函数必须具有以下特点:
如果两个类型相同的对象表示相同的值,则哈希函数必须为两个对象返回相同的常数值。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
不论对该对象进行什么样的更改,哈希函数都必须返回完全相同的值。