真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

NET中重寫了Equals還有必要重寫GetHashCode的示例分析

NET中重寫了Equals還有必要重寫GetHashCode的示例分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)建站專注于茶陵網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供茶陵?duì)I銷型網(wǎng)站建設(shè),茶陵網(wǎng)站制作、茶陵網(wǎng)頁(yè)設(shè)計(jì)、茶陵網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造茶陵網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供茶陵網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

咨詢區(qū)

  • 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,請(qǐng)問在重寫 GetHashCode() 方法時(shí)我該用哪一種實(shí)現(xiàn)呢?

  • base.GetHashCode();

  • this.FooId.GetHashCode();

 

回答區(qū)

  • Marc Gravell

如果你的 item 要作為 DictionaryHashSet 中的key時(shí),那重寫 GetHashCode() 簡(jiǎn)直就是剛需,因?yàn)榧蠒?huì)根據(jù) item 的 hashcode 對(duì) item 進(jìn)行分組,如果兩個(gè) item 的 hashcode 不一樣,那么 equals 將永遠(yuǎn)不會(huì)被調(diào)用,GetHashCode() 方法應(yīng)該要體現(xiàn) Equals 的邏輯,比較方式大概如下:

  • 如果 Equals 判定為相等,那么 GetHashCode 必須相等。

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

再回到你的場(chǎng)景,用 return FooId 來作為 GetHashCode() 的實(shí)現(xiàn)是合理的。

不過作為一般場(chǎng)景,當(dāng) item 中有多個(gè)屬性,推薦的做法是組合多個(gè)屬性,代碼如下:


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 實(shí)現(xiàn)也解決了一個(gè)經(jīng)典的 對(duì)角線沖突 問題,比如說:new Foo(3,5) != new Foo(5,3)。

再提一點(diǎn),作為 .NET 程序的慣用習(xí)慣,推薦再重寫一下 ==!= 操作符。

 

點(diǎn)評(píng)區(qū)

這個(gè)問題其實(shí)非常經(jīng)典, EqualsGetHashCode 到底是什么關(guān)系呢?

我個(gè)人認(rèn)為:在復(fù)雜類型的比較中, GetHashCode 永遠(yuǎn)是一等公民,Equals 才是二等公民,先判斷 HashCode 是否一致,在不一致的情況下再看 Equals 是否一致?最終判斷對(duì)象是否相等。

還有一點(diǎn)值得注意的是,GetHashCode 的實(shí)現(xiàn)一定要高效,完成理論上的 O(1) 復(fù)雜度,否則在 HashSet,Dictioanry 場(chǎng)景下會(huì)死的很慘,參考 HashSet 的 Contains 。

NET中重寫了Equals還有必要重寫GetHashCode的示例分析    

看完上述內(nèi)容,你們掌握NET中重寫了Equals還有必要重寫GetHashCode的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)頁(yè)標(biāo)題:NET中重寫了Equals還有必要重寫GetHashCode的示例分析
本文來源:http://weahome.cn/article/ggjpsh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部