首頁 >後端開發 >C++ >為什麼在覆蓋`equals'時必須覆蓋``gethashcode''?

為什麼在覆蓋`equals'時必須覆蓋``gethashcode''?

Linda Hamilton
Linda Hamilton原創
2025-02-02 15:16:10347瀏覽

Why Must You Override `GetHashCode` When Overriding `Equals`?

覆蓋GetHashCodeEquals用於一致的對像比較

> 當您重新定義類的對像如何通過覆蓋

>方法比較類的對象時,也必須覆蓋Equals>方法。當您的對像用作基於哈希的集合(例如詞典或哈希集)中的鍵時,這一點尤其重要。 GetHashCode

考慮一個類

Foo>

<code class="language-csharp">public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}</code>
>如果您自定義基於

屬性的對象進行自定義,則默認Equals(從Foo繼承)仍將基於對象的內存地址生成哈希碼。 當將FooId對像用作哈希表中的鍵時,這種不一致會導致不可預測的行為。 GetHashCode Object>Foo為什麼一致的哈希重要

覆蓋至關重要:

>

GetHashCode

一致的散列:
    >對象的哈希代碼確定其在哈希表中的位置。 均等對象
  • 必須具有相同的哈希代碼,以確保它們始終放置在同一桶中。 避免使用哈希碰撞:如果兩個對象具有相同的哈希代碼(碰撞),則基於哈希的集合可能會錯誤地假設它們是相同的,而無需調用
  • 驗證。 良好的>最小化碰撞,確保用於確定真正的平等。 Equals GetHashCodeEquals>實現

GetHashCode實現應與方法的邏輯一致:

GetHashCode均等對象必須具有相同的哈希代碼。 Equals>

>相同的哈希代碼不能保證平等,但是它們觸發了
    的方法進行確定的比較。
  • Equals
  • 類,合適的
覆蓋為:

Foo這將基於GetHashCode>生成哈希碼,鏡像

中的等價檢查
<code class="language-csharp">public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}</code>

使用自定義比較來增強清晰度FooIdEquals>

覆蓋

時,請考慮添加自定義平等運算符(

)以提高代碼可讀性和可維護性。

以上是為什麼在覆蓋`equals'時必須覆蓋``gethashcode''?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn