Ich würde das vermeiden, einfach aus dem Grund, dass es ein Bündel von Zeichenfolgen sinnlos erstellt - obwohl Kosi2801's Punkt über die Herstellung von Kollisionen einfach ist auch relevant. (Ich vermute, es würde nicht eigentlich aufgrund der Beschaffenheit der Felder viele Kollisionen verursachen, aber...)
Ich würde mich für den Algorithmus "einfach und leicht richtig" entscheiden, den ich zuvor in dieser Antwort verwendet (danke fürs Nachschlagen, Lance :) - und die, wie Sie sagten, in Effective Java aufgeführt ist. In diesem Fall würde es enden als:
public int GetHashCode()
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + StreetAddress.GetHashCode();
hash = hash * 23 + RuralRoute.GetHashCode();
hash = hash * 23 + City.GetHashCode();
hash = hash * 23 + Province.GetHashCode();
hash = hash * 23 + Country.GetHashCode();
hash = hash * 23 + PostalCode.GetHashCode();
return hash;
}
Das ist natürlich nicht null-sicher. Wenn Sie C# 3 verwenden, sollten Sie vielleicht eine Erweiterungsmethode in Betracht ziehen:
public static int GetNullSafeHashCode<T>(this T value) where T : class
{
return value == null ? 1 : value.GetHashCode();
}
Dann können Sie verwenden:
public int GetHashCode()
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + StreetAddress.GetNullSafeHashCode();
hash = hash * 23 + RuralRoute.GetNullSafeHashCode();
hash = hash * 23 + City.GetNullSafeHashCode();
hash = hash * 23 + Province.GetNullSafeHashCode();
hash = hash * 23 + Country.GetNullSafeHashCode();
hash = hash * 23 + PostalCode.GetNullSafeHashCode();
return hash;
}
Sie könnte ein Parameter-Array-Methoden-Dienstprogramm erstellen, um dies noch einfacher zu gestalten:
public static int GetHashCode(params object[] values)
{
int hash = 17;
foreach (object value in values)
{
hash = hash * 23 + value.GetNullSafeHashCode();
}
return hash;
}
und rufen Sie es mit auf:
public int GetHashCode()
{
return HashHelpers.GetHashCode(StreetAddress, RuralRoute, City,
Province, Country, PostalCode);
}
Bei den meisten Typen sind Primitive involviert, so dass das Boxing etwas unnötig wäre, aber in diesem Fall hätten Sie nur Referenzen. Natürlich würden Sie am Ende unnötigerweise ein Array erstellen, aber Sie wissen ja, was man über vorzeitige Optimierung sagt...
1 Stimmen
Zu Ihrer Information: stackoverflow.com/questions/263400/