entspricht Methodenimplementierungshelfern (C #)

8

Jedes Mal, wenn ich eine Datenklasse schreibe, verbringe ich normalerweise so viel Zeit damit, die IEquatable-Implementierung zu schreiben.

Die letzte Klasse, die ich geschrieben habe, war etwas wie:

%Vor%

Die Implementierung von IEquatable war extrem. Sicherlich hilft C # 3.0 / LINQ sehr, aber die Vertices können verschoben und / oder in umgekehrter Reihenfolge angeordnet werden, was der Equals-Methode eine Menge Komplexität hinzufügt. Nach vielen Komponententests und der entsprechenden Implementierung gab ich auf und änderte meine Anwendung, um nur Dreiecke zu akzeptieren, wobei die IEquatable-Implementierung nur 11 Unit-Tests benötigte, um vollständig abgedeckt zu werden.

Gibt es ein Werkzeug oder eine Technik, die bei der Implementierung von Equals und GetHashCode helfen?

    
Jader Dias 07.06.2009, 22:37
quelle

2 Antworten

8

Ich benutze ReSharper, um Gleichheitselemente zu erzeugen. Es wird optional IEquatable<T> implementieren sowie Operatoren überschreiben, wenn Sie das wollen (was Sie natürlich nie tun, aber es ist trotzdem cool).

Die Implementierung von Equals enthält eine Überschreibung von Object.Equals(Object) sowie eine stark typisierte Variante (die eine unnötige Typüberprüfung vermeiden kann). Die weniger typisierte Version ruft die stark typisierte Version nach einer Typprüfung auf. Die stark typisierte Version führt eine Referenzgleichheitsprüfung durch ( Object.ReferenceEquals(Object,Object) ) und vergleicht dann die Werte aller Felder (nun, nur diejenigen, die Sie dem Generator mitteilen).

Wie bei GetHashCode wird eine intelligente Faktorisierung der GetHashCode -Werte des Feldes kombiniert (mit unchecked , um Überlauf-Ausnahmen zu vermeiden, wenn Sie die checked -Option des Compilers verwenden). Jeder der Feldwerte (abgesehen von dem ersten) wird vor der Kombination mit Primzahlen multipliziert. Sie können auch angeben, welche Felder niemals null sein würden, und es werden alle Null-Prüfungen gelöscht.

Hier erhalten Sie, was Sie für Ihre Polygon -Klasse erhalten, indem Sie ALT+Insert drücken und dann " Gleichheitselemente erstellen " auswählen:

%Vor%

Einige der Funktionen, über die ich oben gesprochen habe, gelten nicht, da es nur ein Feld gibt. Beachten Sie auch, dass der Inhalt des Arrays nicht überprüft wurde.

Im Allgemeinen pumpt ReSharper jedoch in wenigen Sekunden eine Menge exzellenten Code. Und dieses Feature ist ziemlich niedrig auf meiner Liste von Dingen, die ReSharper so ein erstaunliches Werkzeug macht.

    
Drew Noakes 07.06.2009, 22:44
quelle
2

Zum Vergleich zweier Objektgruppen verwende ich die SequenzEqual Erweiterungsmethode.

Wie bei einem generischen Equals und GetHashCode gibt es eine auf Serialisierung basierende Technik, die für Sie funktionieren könnte.

Verwenden von MemoryStream und BinaryFormatter für wiederverwendbare GetHashCode- und DeepCopy-Funktionen

>     
Cameron MacFarland 07.06.2009 23:22
quelle