Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Catatan
Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.
Asisten Penelusuran Kesalahan yang Terkelola (MDA) moduloObjectHashcode mengubah perilaku kelas Object untuk melakukan operasi modulus pada kode hash yang dikembalikan oleh metode GetHashCode. Modulus default untuk MDA ini adalah 1, yang menyebabkan GetHashCode mengembalikan 0 untuk semua objek.
Gejala
Setelah pindah ke versi baru runtime bahasa umum (CLR), sebuah program tidak lagi dijalankan dengan benar:
Program mendapatkan objek yang salah dari Hashtable.
Urutan enumerasi dari Hashtable memiliki perubahan yang merusak program.
Dua objek yang dulunya sama kini tidak lagi sama.
Dua objeck yang dulunya tidak sama kini menjadi sama.
Penyebab
Program Anda mungkin mendapatkan objek yang salah dari Hashtable karena penerapan metode Equals pada kelas untuk kunci ke dalam Hashtable menguji kesetaraan objek dengan membandingkan hasil panggilan ke metode GetHashCode. Kode hash tidak boleh digunakan untuk menguji kesetaraan objek karena dua objek mungkin memiliki kode hash yang sama meskipun bidangnya masing-masing memiliki nilai yang berbeda. Tabrakan kode hash ini, meskipun jarang dalam praktiknya, memang terjadi. Efeknya pada pencarian Hashtable adalah bahwa dua kunci yang tidak sama tampak sama, dan objek yang salah dikembalikan dari Hashtable. Untuk alasan performa, implementasi GetHashCode dapat berubah di antara versi runtime, sehingga tabrakan yang mungkin tidak terjadi pada satu versi dapat terjadi pada versi berikutnya. Aktifkan MDA ini untuk menguji apakah kode Anda memiliki bug saat kode hash bertabrakan. Saat diaktifkan, MDA ini menyebabkan metode GetHashCode mengembalikan 0, sehingga semua kode hash bertabrakan. Satu-satunya efek yang memungkinkan MDA ini pada program Anda adalah program Anda berjalan lebih lambat.
Urutan enumerasi dari Hashtable dapat berubah dari satu versi runtime ke versi lain jika algoritme yang digunakan untuk menghitung kode hash untuk perubahan kunci. Untuk menguji apakah program Anda telah mengambil ketergantungan pada urutan enumerasi kunci atau nilai dari tabel hash, Anda dapat mengaktifkan MDA ini.
Resolusi
Jangan pernah menggunakan kode hash sebagai pengganti identitas objek. Terapkan penggantian metode Object.Equals untuk tidak membandingkan kode hash.
Jangan membuat dependensi pada urutan enumerasi kunci atau nilai dalam tabel hash.
Efek pada Runtime
Aplikasi berjalan lebih lambat saat MDA ini diaktifkan. MDA ini hanya mengambil kode hash yang akan dikembalikan dan sebaliknya mengembalikan sisanya ketika dibagi dengan modulus.
Output
Tidak ada output untuk MDA ini.
Konfigurasi
Atribut modulus menentukan modulus yang digunakan pada kode hash. Nilai default adalah 1.
<mdaConfig>
<assistants>
<moduloObjectHashcode modulus="1" />
</assistants>
</mdaConfig>