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.

questionAnswers(5)

yourAnswerToTheQuestion