首页 > Windows开发 > 详细

c#中Equals方法和GetHashCode

时间:2021-09-21 12:05:11      阅读:40      评论:0      收藏:0      [点我收藏+]

c#中,一般来说,重写了Equals方法,就要重写GetHashCode

关于Equals方法,一般都会按照自己的需求编写

关于GetHashCode,MS说的很清楚

  • 两个相同的对象(即Equals方法返回true)必须返回相同的hash code
  • 两个不相同的对象,返回true或者false都可以

如果两个相同的对象,hash code返回false了,结果会怎么样?

 

    class Program
    {
        static void Main(string[] args)
        {
            var stu1 = new Student(1, "Zhangsan");
            var stu2 = new Student(2, "Lisi");
            var stu3 = new Student(1, "Zhangsan-rename");


            var dic = new Dictionary<Student, string>();
            dic[stu1] = "aaa";
            dic[stu2] = "bbb";
            dic[stu3] = "ccc";
        }
    }

    public class Student
    {
        public Student(int id, string name)
        {
            Id = id;
            Name = name;
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public override bool Equals(object obj)
        {
            return obj is Student student && this.Id == student.Id;
        }

        public override int GetHashCode()
        {
            //return DateTime.Now.Millisecond;
            return this.Id;
        }
    }

如上面代码,现在相同的对象一定返回相同的hashcode,因为他们的Id 相同,可以查看字典的元素

技术分享图片

 

字典只有两个元素,因为stu1和stu2是同一个对象,只能代表一个键

如果修改成这样的代码

        public override int GetHashCode()
        {
            return DateTime.Now.Millisecond;
            //return this.Id;
        }

现在的结果变成了3个元素,原因是stu1和stu2的哈希值不相同,就不需要再比较Equals方法的结果了

技术分享图片

 

c#中Equals方法和GetHashCode

原文:https://www.cnblogs.com/chenyingzuo/p/15308074.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!