Nur um die obigen Antworten hinzuzufügen:
Wenn Sie Equals nicht überschreiben, werden standardmäßig Referenzen der Objekte verglichen. Gleiches gilt für Hashcode - die Standardimplementierung basiert normalerweise auf einer Speicheradresse der Referenz. Da Sie Equals überschrieben haben, bedeutet dies, dass das richtige Verhalten darin besteht, alles zu vergleichen, was Sie auf Equals implementiert haben, und nicht die Referenzen. Daher sollten Sie dasselbe für den Hashcode tun.
Clients Ihrer Klasse erwarten, dass der Hashcode eine ähnliche Logik wie die equals-Methode aufweist. Beispielsweise vergleichen linq-Methoden, die einen IEqualityComparer verwenden, zuerst die Hashcodes und nur dann, wenn sie gleich sind, vergleichen sie die Equals () -Methode, die möglicherweise teurer ist Wenn wir keinen Hashcode implementiert haben, hat das gleiche Objekt wahrscheinlich unterschiedliche Hashcodes (weil sie unterschiedliche Speicheradressen haben) und wird fälschlicherweise als ungleich bestimmt (Equals () trifft nicht einmal).
Abgesehen von dem Problem, dass Sie Ihr Objekt möglicherweise nicht finden können, wenn Sie es in einem Wörterbuch verwendet haben (weil es von einem Hashcode eingefügt wurde und wenn Sie danach suchen, wird der Standard-Hashcode wahrscheinlich anders sein und wieder Equals () wird nicht einmal aufgerufen, wie Marc Gravell in seiner Antwort erklärt, Sie führen auch eine Verletzung des Wörterbuch- oder Hashset-Konzepts ein, die keine identischen Schlüssel zulassen sollte - Sie haben bereits erklärt, dass diese Objekte im Wesentlichen gleich sind, wenn Sie Equals überschreiben, also ziehen Sie an Sie möchten nicht, dass beide Schlüssel in einer Datenstruktur unterschiedliche Schlüssel haben, die einen eindeutigen Schlüssel haben. Da sie jedoch einen anderen Hashcode haben, wird der "gleiche" Schlüssel als unterschiedlicher Schlüssel eingefügt.