zoukankan      html  css  js  c++  java
  • NET(C#):GetHashCode不需要太复杂 转 武胜

    我觉得简而言之GetHashCode的作用就是:尽量用最快的时间对对象进行初步判断。当然这里时间的快慢和判断的深度没有具体要求,只要没有走极端就可以(比如太费时间,或者判断深度太浅)。因此没必要吧GetHashCode搞得太复杂!

    还有人错误的认为字典的存储是完全靠GetHashCode的结果,显然这是不对的,GetHashCode仅返回一个int怎能胜任所有结果呢?

    来看这个例子,这样一个类,他的GetHashCode返回整数数据的余2的结果。(仅为做示例,很显然这个GetHashCode的执行很有效率但是比较深度也太差了)

        classa

        {

            publicint Id { get; privateset; }

            public a(int i)

            {

                Id = i;

            }

            publicoverridebool Equals(object obj)

            {

                Console.WriteLine("Equals");

                if (obj ==null|| GetType() != obj.GetType())

                {

                    returnfalse;

                }

                return Id == ((a)obj).Id;

            }

            //返回余2的结果

            publicoverrideint GetHashCode()

            {

                Console.WriteLine("GetHashCode");

                return Id %2;

            }

        }

    接着执行代码:

                var o1 =newa(1); //GetHashCode返回1

                var o2 =newa(2); //GetHashCode返回0

                var o3 =newa(3); //GetHashCode返回1

                var dic =newDictionary<a, object>();

                dic.Add(o1, 123);

                Console.WriteLine("分隔符");

                Console.WriteLine(dic.ContainsKey(o2));

                Console.WriteLine("分隔符");

                Console.WriteLine(dic.ContainsKey(o3));

    程序输出:

    GetHashCode

    分隔符

    GetHashCode

    False

    分隔符

    GetHashCode

    Equals

    False

    可 以看到,当GetHashCode可以直接分辨出不相等时,Equals就没必要调用了,而当GetHashCode返回相同结果时,Equals方法会 被调用从而确保判断对象是否真的相等。所以,还是那句话:GetHashCode没必要一定把对象分辨得很清楚(况且它也不可能,一个int不可能代表所 有的可能出现的值),有Equals在后面做保障。GetHashCode仅需要对对象进行快速判断。

    最后你可能有些疑惑为什么不直接用Equals非得搞个GetHashCode在前面先判断一下?这个由于Equals方法比必须把两个对象搞清楚是等于 还是不等于,所以可能效率不是最优的(况且Object.Equals通常包含类型的转换,这个可以参考IEquatable或 IEqualityComparer,他们支持泛型),而GetHashCode不需要绝对弄清楚是否相等所以可以优化下效率。举个最简单的例子,比较两 个人是不是完全一样(一样的话代表是他的克隆人),Equals会一个细胞接一个细胞得比较,而GetHashCode可以通过判断性别,长相,声音…… 快速得进行判断。所以先用GetHashCode会很快的判断出许多不同的人,当然如果GetHashCode返回True(遇到了双胞胎),再用 Equals进行彻底的比较。

  • 相关阅读:
    关于初入.NET的那些事
    有趣的接口和抽象类
    类型转换的那些趣事(is和as)
    【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口
    【项目实践】一文带你搞定Session和JWT的登录认证方式
    【项目实践】后端接口统一规范的同时,如何优雅得扩展规范
    羊车门问题简析
    对于python这门课程的一些想法、计划、期望
    Android 4.1果冻豆新特性详解
    使用include实现布局(layout)复用
  • 原文地址:https://www.cnblogs.com/zeroone/p/2454755.html
Copyright © 2011-2022 走看看