Ya, penting jika item Anda akan digunakan sebagai kunci dalam kamus, atau HashSet<T>
, dll - karena ini digunakan (tanpa adanya kebiasaan IEqualityComparer<T>
) untuk mengelompokkan item ke dalam ember. Jika kode hash untuk dua item tidak cocok, mereka mungkin tidak pernah dianggap sama ( Persamaan tidak akan pernah disebut).
Metode GetHashCode () harus mencerminkan Equals
logika; aturannya adalah:
- jika dua hal sama (
Equals(...) == true
) maka mereka harus mengembalikan nilai yang sama untukGetHashCode()
- jika
GetHashCode()
sama, tidak perlu bagi mereka untuk menjadi sama; ini adalah tabrakan, dan Equals
akan dipanggil untuk melihat apakah itu persamaan nyata atau tidak.
Dalam hal ini, sepertinya " return FooId;
" merupakan GetHashCode()
implementasi yang sesuai . Jika Anda menguji beberapa properti, adalah umum untuk menggabungkannya menggunakan kode seperti di bawah ini, untuk mengurangi tabrakan diagonal (yaitu sehingga new Foo(3,5)
memiliki kode hash yang berbeda 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;
}
Oh - untuk kenyamanan, Anda mungkin juga mempertimbangkan penyediaan ==
dan !=
operator saat mengganti Equals
dan GetHashCode
.
Peragaan tentang apa yang terjadi ketika Anda melakukan kesalahan ini ada di sini .