Habe ich Equals () / GetHashCode () korrekt implementiert?

8

Das Programm hat mit dieser Implementierung gearbeitet:

%Vor%

Aber weil ich Instrument im Dictionary benutzen muss, habe ich beschlossen, equals / hashcode zu implementieren:

%Vor%

Jetzt funktioniert das Programm nicht mehr. An solchen oder ähnlichen Orten erhalte ich "KeyNotFoundException":

%Vor%

Ist es möglich, dass einige Teile des Codes davon ausgehen, dass equals und hashcode NICHT implementiert sind? Oder wahrscheinlich habe ich sie einfach falsch umgesetzt? Entschuldigung, ich bin nicht mit solchen erweiterten Funktionen in C # als letztes Stück Code vertraut und weiß nicht, wie es mit equals oder hashCode verbunden ist.

    
javapowered 18.04.2011, 08:06
quelle

3 Antworten

7

Ihre HashCode- und Equals-Methoden sollten nur von immutable -Eigenschaften abhängen - Ihre Implementierung verwendet ClassCode und Ticker, die beide über Setter verfügen und daher änderbar sind.

    
Joe 18.04.2011, 08:42
quelle
3

Zuerst , anstatt cache.Keys.Any zu verwenden, können Sie einfach ContainsKey .

%Vor%

Die erste iteriert über die gesamte Schlüsselliste - O (n), während die zweite die eingebaute Implementierung der Hash-Tabelle - O (1) verwendet.

Zweite , überprüfen Sie in Ihrer Implementierung, ob ein Nullverweis vorhanden ist:

%Vor%

Ansonsten kann ich kein Problem sehen.

    
HuBeZa 18.04.2011 08:31
quelle
1
  

Aber weil ich Instrument im Dictionary benutzen muss, habe ich beschlossen, equals / hashcode

zu implementieren

Das ist der falsche Grund. Ihre Klasse verfügt bereits über Implementierungen für Equality und GetHashCode, die für die Verwendung in einem Dictionary geeignet, effizient und getestet sind.

  

Habe ich Equals () / GetHashCode () korrekt implementiert?

Nein. Ihnen fehlt eine Überladung für == , mit der Sie beginnen möchten. Und es wird nur zuverlässig sein, wenn Sie Instrument unwandelbar machen.

Ihre beste Vorgehensweise ist nicht , um diese Elemente zu überschreiben.

Siehe auch diese MSDN-Empfehlung . Beachten Sie die "Garantien von Gleichen" und

  

Das Überschreiben von Operator == in nicht unveränderlichen Typen wird nicht empfohlen.

    
Henk Holterman 18.04.2011 10:11
quelle

Tags und Links