Neden önemli GetHashCode yöntem geçersiz kılma için zaman Eşittir?
Aşağıdaki sınıf verildi
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();
}
}
Foo
Foo
s tablo için bir satır temsil ettiği için Equals
yöntem geçersiz. GetHashCode
öncelikli tercih edilen bir yöntemdir?
Neden GetHashCode
geçersiz kılmak için önemli mi?
CEVAP
Evet, bu önemli öğe olarak kullanılacak anahtar sözlük ya da HashSet<T>
vb - çünkü bu terim kullanılır (yokluğunda bir özel IEqualityComparer<T>
) grup öğeleri içine kovalar. Eğer iki ürün için karma kodu eşleşmiyor, onlar olabiliraslaeşit (Equals
sadece hiç aramadı olacak) sayılacak.
GetHashCode()
yöntemi Equals
mantık yansıtmalıdır; kurallar şunlardır:
- eğer iki şey eşit (
Equals(...) == true
) sonra onlargerekirGetHashCode()
için aynı değeri döndürür - eğer
GetHashCode()
eşit olsundeğilonları aynı; bunun için gerekli bir çarpışma, veEquals
eğer gerçek bir eşitlik olup olmadığını görmek için çağrılır.
Bu durumda, "return FooId;
" GetHashCode()
uygun bir uygulama görünüyor. Eğer test birden çok özellik, ortak birleşerek onları kullanarak kod aşağıdaki gibi, azaltmak için çapraz çarpışmalar (yani böylece new Foo(3,5)
ayrı hash-code new Foo(5,3)
):
int hash = 13;
hash = (hash * 7) field1.GetHashCode();
hash = (hash * 7) field2.GetHashCode();
...
return hash;
Oh rahatlık için de Equals
GetHashCode
geçersiz kılarken ==
!=
operatörler sağlayan düşünebilirsiniz.
Eğer yanlış ne olur bir gösteri here.
Neden '397' ReSharper GetHas...
Geçersiz kılınmış bir Sistem için en i...
Neden't statik Java yöntemleri ge...
::push_back vector) kullanır değeri, s...
Ne zaman bir yöntem parametreleri ve y...