GetHashCode

来源:互联网 发布:费用报销软件 编辑:程序博客网 时间:2024/05/19 12:13

在判断时,并不是直接上来就调用Equals方法,而是会先调用GetHashCode方法,计算出待添加对象的一个散列值:

  1. 如果这个散列值不命中,那就说明这个对象一定不在散列中,可以添加;
  2. 如果这个散列值命中了,那也不能说明这个对象一定在散列中,因为可能散列值冲突了,所以,要继续调用Equals方法,来看看这个散列值命中的对象,到底在不在散列表里。
Equals和GetHashCode的关系:
    Equals方法和GetHashCode方法的重写应该同时存在如果Equals方法返回的结果是true,那么GetHashCode方法返回的结果应该相同。如果GetHashCode方法返回的结果相同,那么Equals方法返回的结果不一定是true

   如果GetHashCode返回的结果相同的话,就没必要调用Equals了;如果GetHashCode返回的结果不同,才会再调用Equals方法,做精确对比。

class Student{    public string FirstName{    get;private set;}public string LastName{    get;private set;}public Student(string firstName,string lastName){    this.FirstName = firstName;this.LastName = lastName;}public override bool Equals(object obj){    Console.WriteLine("Equals");if(obj == null || this.GetType() != obj.GetType())    return false;return this.FirstName == ((Student)obj).FirstName && this.LastName == ((Student)obj).LastName;}public override int GetHashCode(){    Console.WriteLine("GetHashCode");return this.FirstName.GetHashCode();}void Main(){    Student student1 = new Student("Jun","Lei");        Student student2 = new Student("Kaifu","Li");        Student student3 = new Student("Jun","Zhu");        var dic = new Dictionary<Student,object>();        dic[student1] = new object();        Console.WriteLine("==================");        Console.WriteLine(dic.ContainsKey(student2));        Console.WriteLine("==================");        Console.WriteLine(dic.ContainsKey(student3));}}


原创粉丝点击