Entwickler-Ecke
WinForms - override Equals und GetHashCode
lapadula - Do 23.03.17 15:52
Titel: override Equals und GetHashCode
Hallo,
ich habe ein paar Objekte in einer ComboBox, beim auslösen eines Events, soll das passende Objekt in der ComboBox angezeigt, bzw. selektiert werden.
C#-Quelltext
1:
| cbOrte.SelectedItem = Ort; |
Um SelectedItem nutzen zu können, muss ich die
Equals-Methode überschreiben.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public override bool Equals(object obj) { Ort standort = obj as Ort; if (standort == null) return false; else return Id.Equals(standort.Id); } |
Ansonsten vergleicht er die Referenz, so wie ich heute gelernt habe. So vergleicht er die IDs.
Es funktioniert wie es soll aber er warnt mich mit der Meldung:
"Warnung ... überschreibt Object.Equals(object o), aber nicht Object.GetHashCode()"
Warum muss ich die GetHashCode-Methode überschreiben und wozu dient diese überhautp?
Moderiert von Th69: C#-Tags hinzugefügt
Ralf Jansen - Do 23.03.17 16:34
Zitat: |
Warum muss ich die GetHashCode-Methode überschreiben und wozu dient diese überhautp? |
Du musst nicht aber man sollte (ist ja eine Warnung).
GetHashcode ist für einen schnelleren Vergleich als Equals gedacht. Mit einem Hash kann man schnell Ungleichheit feststellen. Schnell weil der Hash einfach nur eine Zahl ist. Was genau ein Hash ist, wie der erzeugt wird würde ich dich auf Wikipedia oder sonst eine Quelle verweisen. Dazu sind Unmengen an Infos zu finden.
Das Framework selbst benutzt meist einen Kombination aus GetHashcode und Equals um Gleichheit/Ungleichheit festzustellen. Zum Beispiel wenn du in irgendeinen Listen Typ (natürlich erst recht bei einer Hash basierten Liste wie Hashset oder Dictionary) etwas finden willst zum Beispiel per Contains Methode würde erst der Hashcode verglichen (schnell) und im Falle das die Hashcodes gleich sind dann erst Equals benutzt (langsam da hier ja eine genaue Prüfung stattfindet).
Bedeutet wenn du 2 Ort Objekte erzeugst mit gleichem Inhalt würde Equals die für gleich halten (zumindest wenn die die gleiche ID haben was ein wenig dünn klingt) aber der GetHashcode Test die für ungleich weil die Standardimplementierung die Refrenzen Vergleicht und zwei zwar inhaltlich gleiche Objekte doch an anderen Stellen im Speicher liegen. Potentiell könnte das schon bei einer ComboBox ein Problem sein je nachdem wie die Liste der Elemente in der Kombobox verwaltet werden oder welchen Listentyp du beim Databinding verwendet hast.
lapadula - Do 23.03.17 17:41
Vielen Dank für die Antwort.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!