Heim > Backend-Entwicklung > C++ > Warum müssen Sie `gethashcode` überschreiben, wenn Sie' Equals 'überschreiben?

Warum müssen Sie `gethashcode` überschreiben, wenn Sie' Equals 'überschreiben?

Linda Hamilton
Freigeben: 2025-02-02 15:16:10
Original
407 Leute haben es durchsucht

Why Must You Override `GetHashCode` When Overriding `Equals`?

überschreiben GetHashCode und Equals für einen konsistenten Objektvergleich

Wenn Sie neu definieren, wie Objekte einer Klasse für Gleichheit verglichen werden, indem die Methode Equals überschritten wird, ist es wichtig, die GetHashCode -Methode zu überschreiben. Dies ist besonders wichtig, wenn Ihre Objekte als Schlüssel in Hash-basierten Sammlungen wie Wörterbüchern oder Hash-Sets verwendet werden.

Betrachten Sie eine Klasse Foo:

public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}
Nach dem Login kopieren

Wenn Sie Equals an die Vergleich von Foo Objekten basierend auf einer FooId -Mobilie anpassen, generiert der Standard -GetHashCode (von Object geerbt) weiterhin Hash -Codes basierend auf der Speicheradresse des Objekts. Diese Inkonsistenz führt zu unvorhersehbarem Verhalten, wenn Foo Objekte als Schlüssel in Hash -Tabellen verwendet werden.

Warum konsequente Hashing -Angelegenheiten

überschrieben GetHashCode ist entscheidend für:

  • Konsistentes Hashing: Der Hash -Code eines Objekts bestimmt seinen Standort in einer Hash -Tabelle. Gleiche Objekte muss denselben Hash -Code haben, um sicherzustellen, dass sie konsequent in denselben Eimer platziert werden.
  • Vermeidung von Hash-Kollisionen: Wenn zwei Objekte denselben Hash-Code (eine Kollision) haben, können Hash-basierte Sammlungen fälschlicherweise davon ausgehen, dass sie identisch sind, ohne Equals aufzurufen, um dies zu überprüfen. Ein gut implementiertes GetHashCode minimiert Kollisionen und stellt sicher, dass Equals die wahre Gleichheit bestimmen.

implementieren GetHashCode effektiv

Die GetHashCode -Implementierung sollte mit der Logik der Equals -Methode übereinstimmen:

  • Gleiche Objekte müssen identische Hash -Codes haben.
  • identische Hash -Codes garantieren keine Gleichheit, sondern lösen die Equals -Methode für einen endgültigen Vergleich aus.

Für die Foo Klasse ist eine geeignete GetHashCode -Verhebung:

public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}
Nach dem Login kopieren

Dies erzeugt Hash -Codes basierend auf FooId und spiegelt die Gleichheitsprüfung in Equals.

Verwenden benutzerdefinierter Vergleiche für erweiterte Klarheit

Wenn Sie

und Equals überschreiben, sollten Sie benutzerdefinierte Gleichstellungsoperatoren (GetHashCode und ==) für eine verbesserte Code -Lesbarkeit und -wartbarkeit hinzufügen. !=

Das obige ist der detaillierte Inhalt vonWarum müssen Sie `gethashcode` überschreiben, wenn Sie' Equals 'überschreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage