Rumah >pembangunan bahagian belakang >C++ >Kenapa anda mesti mengatasi `gethashcode` ketika mengatasi` sama`?

Kenapa anda mesti mengatasi `gethashcode` ketika mengatasi` sama`?

Linda Hamilton
Linda Hamiltonasal
2025-02-02 15:16:10349semak imbas

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

overriding dan GetHashCode untuk perbandingan objek yang konsisten Equals

Apabila anda mentakrifkan semula bagaimana objek kelas dibandingkan dengan kesamaan dengan mengatasi kaedah

, adalah penting untuk mengatasi kaedah Equals. Ini amat penting apabila objek anda digunakan sebagai kunci dalam koleksi berasaskan hash seperti kamus atau set hash. GetHashCode

Pertimbangkan kelas

: Foo

<code class="language-csharp">public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}</code>
Jika anda menyesuaikan

untuk membandingkan Equals objek berdasarkan harta Foo, lalai FooId (diwarisi dari GetHashCode) masih akan menghasilkan kod hash berdasarkan alamat memori objek. Ketidakkonsistenan ini membawa kepada tingkah laku yang tidak dapat diramalkan apabila menggunakan objek Object sebagai kunci dalam jadual hash. Foo

mengapa perkara hashing konsisten

overriding

sangat penting untuk: GetHashCode

Hashing yang konsisten:
    Kod hash objek menentukan lokasinya dalam jadual hash. Objek yang sama
  • mesti mempunyai kod hash yang sama untuk memastikan ia secara konsisten diletakkan dalam baldi yang sama. Mengelakkan perlanggaran hash:
  • Jika dua objek mempunyai kod hash yang sama (perlanggaran), koleksi berasaskan hash mungkin salah menganggap mereka sama tanpa memanggil
  • untuk mengesahkan. yang dilaksanakan dengan baik meminimumkan perlanggaran, memastikan digunakan untuk menentukan kesamaan yang benar. Equals GetHashCode Equals
  • pelaksanaan
berkesan

GetHashCode pelaksanaan harus sejajar dengan logik kaedah

:

GetHashCode Equals objek yang sama mesti mempunyai kod hash yang sama.

    Kod hash yang sama tidak menjamin kesamaan, tetapi mereka mencetuskan kaedah
  • untuk perbandingan muktamad.
  • Equals untuk kelas
  • , yang sesuai
override adalah:

Foo GetHashCode ini menghasilkan kod hash berdasarkan

, mencerminkan pemeriksaan kesamaan dalam
<code class="language-csharp">public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}</code>
.

FooId Equals Menggunakan pembanding tersuai untuk kejelasan yang dipertingkatkan

Apabila mengatasi dan

, pertimbangkan untuk menambah pengendali kesetaraan tersuai (

dan Equals) untuk kebolehbacaan kod yang lebih baik dan penyelenggaraan. GetHashCode

Atas ialah kandungan terperinci Kenapa anda mesti mengatasi `gethashcode` ketika mengatasi` sama`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn