Zwięzły sposób łączenia haszów pól?
Jeden, jeśli sposoby implementacji GetHashCode - tam, gdzie jest to wymagane - jest opisane przez Jona Skeetatutaj. Powtarzając swój kod:
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}
Ręczne przewijanie tego kodu może być podatne na błędy, a błędy mogą być subtelne / trudne do wykrycia (czy zamieniłeś się+
i*
przez pomyłkę?), może być trudno zapamiętać reguły kombinacji dla różnych typów i nie lubię wydawać wysiłku umysłowego na pisanie / przeglądanie tego samego w kółko dla różnych pól i klas. Może również zaciemnić jeden z najważniejszych szczegółów (czy pamiętam, aby uwzględnić wszystkie pola?) W powtarzającym się szumie.
Czy istnieje zwięzły sposób łączenia hashcodes pola przy użyciu biblioteki .net?. Oczywiście mógłbym napisać własny, ale jeśli jest coś idiomatycznego / wbudowanego, wolę to.
Jako przykład w Javie (używając JDK7) mogę osiągnąć powyższe używając:
@Override
public int hashCode()
{
return Objects.hash(field1, field2, field3);
}
To naprawdę pomaga wyeliminować błędy i skupić się na ważnych szczegółach.
Motywacja: natknąłem się na klasę C #, która wymaga przesłonięciaGetHashCode()
, ale sposób, w jaki łączył hashcody różnych składników, miał poważne błędy. Funkcja biblioteczna do łączenia haszokodów byłaby przydatna do unikania takich błędów.