现在的位置: 首页 > 综合 > 正文

对象的Equals、GetHashCode

2012年07月03日 ⁄ 综合 ⁄ 共 1610字 ⁄ 字号 评论关闭

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 的,而且,必须至少使用一个实例字段作为输入。 哈希函数必须具有以下特点:

如果两个类型相同的对象表示相同的值,则哈希函数必须为两个对象返回相同的常数值。

为了获得最佳性能,哈希函数必须为所有输入生成随机分布。

不论对该对象进行什么样的更改,哈希函数都必须返回完全相同的值。

抱歉!评论已关闭.