第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么在重寫Equals方法時(shí)重寫GetHashCode很重要?

為什么在重寫Equals方法時(shí)重寫GetHashCode很重要?

qq_花開花謝_0 2019-05-27 11:23:30
為什么在重寫Equals方法時(shí)重寫GetHashCode很重要?鑒于以下課程public class Foo{     public int FooId { get; set; }     public string FooName { get; set; }     public override bool Equals(object obj)     {         Foo fooItem = obj as Foo;         return fooItem.FooId == this.FooId;     }     public override int GetHashCode()     {         // Which is preferred?         return base.GetHashCode();         //return this.FooId.GetHashCode();     }}我已經(jīng)覆蓋了該Equals方法,因?yàn)樗麱oo代表了Foos表的一行。哪個(gè)是覆蓋的首選方法GetHashCode?覆蓋為什么重要GetHashCode?
查看完整描述

4 回答

?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊

是的,重要的是,您的項(xiàng)目將用作字典中的鍵,或者HashSet<T>等等 - 因?yàn)檫@是用于(在沒有自定義的情況下IEqualityComparer<T>)將項(xiàng)目分組到存儲(chǔ)桶中。如果兩個(gè)項(xiàng)的哈希碼不匹配,它們可能永遠(yuǎn)不會(huì)被認(rèn)為是相等的(Equals將永遠(yuǎn)不會(huì)被調(diào)用)。

GetHashCode()方法應(yīng)反映Equals邏輯; 規(guī)則是:

  • 如果兩個(gè)東西相等(Equals(...) == true)那么它們必須返回相同的值GetHashCode()

  • 如果GetHashCode()是相等的,它是必要對他們是相同的; 這是一次碰撞,Equals將被調(diào)用以查看它是否是真正的平等。

在這種情況下,看起來“ return FooId;”是一個(gè)合適的GetHashCode()實(shí)現(xiàn)。如果您正在測試多個(gè)屬性,通常使用下面的代碼組合它們,以減少對角線沖突(即,new Foo(3,5)具有不同的哈希碼new Foo(5,3)):

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;}

哦 - 為了方便起見,你也可以考慮提供==!=操作員覆蓋EqualsGetHashCode


當(dāng)你弄錯(cuò)了會(huì)發(fā)生什么事的證明就在這里。


查看完整回答
反對 回復(fù) 2019-05-27
?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

實(shí)際上很難GetHashCode()正確實(shí)現(xiàn),因?yàn)槌薓arc已經(jīng)提到的規(guī)則之外,哈希代碼在對象的生命周期內(nèi)不應(yīng)該改變。因此,用于計(jì)算哈希碼的字段必須是不可變的。

當(dāng)我使用NHibernate時(shí),我終于找到了解決這個(gè)問題的方法。我的方法是從對象的ID計(jì)算哈希碼。只能通過構(gòu)造函數(shù)設(shè)置ID,因此如果要更改ID,這是非常不可能的,您必須創(chuàng)建一個(gè)具有新ID的新對象,因此需要新的哈希代碼。這種方法最適用于GUID,因?yàn)槟梢蕴峁╇S機(jī)生成ID的無參數(shù)構(gòu)造函數(shù)。


查看完整回答
反對 回復(fù) 2019-05-27
?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

通過重寫Equals,您基本上聲明自己是更了解如何比較給定類型的兩個(gè)實(shí)例的人,因此您很可能是提供最佳哈希碼的最佳候選者。

這是ReSharper如何為您編寫GetHashCode()函數(shù)的示例:

public override int GetHashCode(){
    unchecked
    {
        var result = 0;
        result = (result * 397) ^ m_someVar1;
        result = (result * 397) ^ m_someVar2;
        result = (result * 397) ^ m_someVar3;
        result = (result * 397) ^ m_someVar4;
        return result;
    }}

正如您所看到的,它只是試圖根據(jù)類中的所有字段猜測一個(gè)好的哈希代碼,但是既然您知道對象的域或值范圍,您仍然可以提供更好的哈希代碼。


查看完整回答
反對 回復(fù) 2019-05-27
  • 4 回答
  • 0 關(guān)注
  • 915 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)