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ù)。
直入主題,參考如下代碼:
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();
如果你的 item 要作為 Dictionary
和 HashSet
中的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í)慣,推薦再重寫一下 ==
和 !=
操作符。
這個(gè)問題其實(shí)非常經(jīng)典, Equals
和 GetHashCode
到底是什么關(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 。
看完上述內(nèi)容,你們掌握NET中重寫了Equals還有必要重寫GetHashCode的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!