Mam projekt, w którym intensywnie używam generycznego C# dictionary. Potrzebuję kluczy złożonych, więc jako klucze używam tuples. W pewnym momencie zastanawiałem się, czy nie byłoby korzystne, aby użyć niestandardowej klasy, który buforuje kod skrótu:Dlaczego słownik C# nie wywołuje ukrytej metody GetHashCode
public class CompositeKey<T1, T2> : Tuple<T1, T2>
{
private readonly int _hashCode;
public CompositeKey(T1 t1, T2 t2) : base(t1, t2)
{
_hashCode = base.GetHashCode();
}
public new int GetHashCode()
{
return _hashCode;
}
}
użyłem new
zamiast override
bo myślałem, że nie będzie mieć znaczenie dla tego testu, bo było określenie słownika przy użyciu betonu typ:
var dict = new Dictionary<CompositeKey<string, int>, int>();
zauważyłem jednak, że moja metoda zwyczaj GetHashCode
nie nazywa się w ogóle. Po zmianie new
na override
został on wywołany zgodnie z oczekiwaniami.
Czy ktoś może wyjaśnić, dlaczego ukryta metoda GetHashCode
nie jest wywoływana? Spodziewam się takiego zachowania, czy chciałbym zdefiniować słownika jak ten
var dict = new Dictionary<Tuple<string, int>, int>();
ale gdybym określić typ CompositeKey
wyraźnie jak w moim przykładzie.
P.S. Wiem, że ukrywanie metody GetHashCode
prawdopodobnie nie jest dobrym pomysłem.
Ukrywanie jest złym pomysłem, ponieważ powoduje ten problem! – AndyJ
Oto post wyjaśniający różnicę między nowymi i override ... http://stackoverflow.com/questions/1399127/difference-between-new-and-override – AndyJ
Odkładając na bok, jeśli uważasz, że Twój algorytm hashcode musi zostać zbuforowany, to prawdopodobnie zły algorytm lub niepotrzebnie buforujesz. –