Autor Beitrag
lapadula
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 23.03.17 15:52 
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.
ausblenden C#-Quelltext
1:
cbOrte.SelectedItem = Ort;					

Um SelectedItem nutzen zu können, muss ich die Equals-Methode überschreiben.

ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 23.03.17 17:41 
Vielen Dank für die Antwort.