SORU
16 Aralık 2008, Salı


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 Equalsyöntem geçersiz. GetHashCode öncelikli tercih edilen bir yöntemdir?

Neden GetHashCode geçersiz kılmak için önemli mi?

CEVAP
16 Aralık 2008, Salı


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, ve Equals 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • audivila

    audivila

    5 HAZİRAN 2009
  • Felice Musique

    Felice Musiq

    22 NİSAN 2014
  • Samvith V Rao

    Samvith V Ra

    20 EKİM 2006