网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

NET中重写了Equals还有必要重写GetHashCode的示例分析

NET中重写了Equals还有必要重写GetHashCode的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联建站专注于茶陵网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供茶陵营销型网站建设,茶陵网站制作、茶陵网页设计、茶陵网站官网定制、重庆小程序开发服务,打造茶陵网络公司原创品牌,更为您提供茶陵网站排名全网营销落地服务。

咨询区

  • David Basarab

直入主题,参考如下代码:


public class Foo
{
    public int FooId { get; set; }
    public string FooName { get; set; }

    public override bool Equals(object obj)
    {
        Foo fooItem = obj as Foo;

        if (fooItem == null) 
        {
           return false;
        }

        return fooItem.FooId == this.FooId;
    }

    public override int GetHashCode()
    {
        // Which is preferred?

        return base.GetHashCode();

        //return this.FooId.GetHashCode();
    }
}


 

这里的 Foo 表示 table 中的 row,请问在重写 GetHashCode() 方法时我该用哪一种实现呢?

  • base.GetHashCode();

  • this.FooId.GetHashCode();

 

回答区

  • Marc Gravell

如果你的 item 要作为 DictionaryHashSet 中的key时,那重写 GetHashCode() 简直就是刚需,因为集合会根据 item 的 hashcode 对 item 进行分组,如果两个 item 的 hashcode 不一样,那么 equals 将永远不会被调用,GetHashCode() 方法应该要体现 Equals 的逻辑,比较方式大概如下:

  • 如果 Equals 判定为相等,那么 GetHashCode 必须相等。

  • 如果 GetHashCode 判定为相等,那么 Equals 不一定相等。

再回到你的场景,用 return FooId 来作为 GetHashCode() 的实现是合理的。

不过作为一般场景,当 item 中有多个属性,推荐的做法是组合多个属性,代码如下:


unchecked // only needed if you're compiling with arithmetic checks enabled
{ // (the default compiler behaviour is *disabled*, so most folks won't need this)
    int hash = 13;
    hash = (hash * 7) + field1.GetHashCode();
    hash = (hash * 7) + field2.GetHashCode();
    ...
    return hash;
}

 

值得一提是,上面的 hashcode 实现也解决了一个经典的 对角线冲突 问题,比如说:new Foo(3,5) != new Foo(5,3)

再提一点,作为 .NET 程序的惯用习惯,推荐再重写一下 ==!= 操作符。

 

点评区

这个问题其实非常经典, EqualsGetHashCode 到底是什么关系呢?

我个人认为:在复杂类型的比较中, GetHashCode 永远是一等公民,Equals 才是二等公民,先判断 HashCode 是否一致,在不一致的情况下再看 Equals 是否一致?最终判断对象是否相等。

还有一点值得注意的是,GetHashCode 的实现一定要高效,完成理论上的 O(1) 复杂度,否则在 HashSet,Dictioanry 场景下会死的很惨,参考 HashSet 的 Contains 。

NET中重写了Equals还有必要重写GetHashCode的示例分析    

看完上述内容,你们掌握NET中重写了Equals还有必要重写GetHashCode的示例分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


网页标题:NET中重写了Equals还有必要重写GetHashCode的示例分析
URL网址:http://bjjierui.cn/article/ggjpsh.html

其他资讯