Das ist nicht unbedingt wichtig; es hängt von der Größe Ihrer Sammlungen und Ihren Leistungsanforderungen ab und davon, ob Ihre Klasse in einer Bibliothek verwendet wird, wo Sie die Leistungsanforderungen möglicherweise nicht kennen. Ich weiß häufig, dass meine Sammlungen nicht sehr groß sind und meine Zeit wertvoller ist als ein paar Mikrosekunden Leistung, die ich durch die Erstellung eines perfekten Hash-Codes gewinne; daher verwende ich (um die lästige Warnung des Compilers loszuwerden) einfach:
public override int GetHashCode()
{
return base.GetHashCode();
}
(Natürlich könnte ich auch ein #pragma verwenden, um die Warnung abzuschalten, aber ich bevorzuge diesen Weg).
Wenn Sie sich in der Position befinden, die Sie tun die Leistung benötigen, dann gelten natürlich alle von anderen hier genannten Probleme. Das Wichtigste - sonst erhalten Sie falsche Ergebnisse, wenn Sie Elemente aus einem Hash-Set oder Wörterbuch abrufen: der Hash-Code darf sich während der Lebensdauer eines Objekts nicht ändern (genauer gesagt, während der Zeit, in der der Hash-Code benötigt wird, z. B. als Schlüssel in einem Wörterbuch): Das folgende Beispiel ist falsch, da Value öffentlich ist und daher während der Lebensdauer der Instanz von außen an der Klasse geändert werden kann, so dass Sie es nicht als Grundlage für den Hash-Code verwenden dürfen:
class A
{
public int Value;
public override int GetHashCode()
{
return Value.GetHashCode(); //WRONG! Value is not constant during the instance's life time
}
}
Wenn der Wert jedoch nicht geändert werden kann, ist es in Ordnung, ihn zu verwenden:
class A
{
public readonly int Value;
public override int GetHashCode()
{
return Value.GetHashCode(); //OK Value is read-only and can't be changed during the instance's life time
}
}