Vergleich zweier Instanzen einer Klasse

7

Ich habe eine Klasse wie diese

%Vor%

Ich möchte wissen, ob es möglich ist, mit Instanzen dieser Klasse direkt zu vergleichen und herauszufinden, dass sie genau gleich sind? Was ist der Mechanismus? Ich suche gor sowas wie if(testData1 == testData2) //Do Something Und wenn nicht, wie geht das?

    
Saeid Yazdani 06.12.2011, 12:42
quelle

7 Antworten

18

Sie sollten die IEquatable<T> -Schnittstelle in Ihrer Klasse implementieren, was Ihnen das ermöglicht Definieren Sie Ihre Gleichheitslogik. Eigentlich sollten Sie auch die Methode Equals überschreiben.

%Vor%     
Frederik Gheysels 06.12.2011, 12:45
quelle
5

Es gibt drei Möglichkeiten, wie Objekte eines Referenztyps T miteinander verglichen werden können:

  1. Mit der Methode object.Equals
  2. Mit einer Implementierung von IEquatable<T>.Equals (nur für Typen, die IEquatable<T> implementieren)
  3. Mit dem Vergleichsoperator ==

Darüber hinaus gibt es zwei Möglichkeiten für jeden dieser Fälle:

  1. Der statische Typ der Objekte, die verglichen werden, ist T (oder eine andere Basis von T )
  2. Der statische Typ der Objekte, die verglichen werden, ist object

Die Regeln, die du unbedingt wissen musst, sind:

  • Der Standardwert für Equals und operator== ist der Test auf Referenzgleichheit
  • Implementierungen von Equals funktionieren korrekt, unabhängig davon, welcher statische Typ der zu vergleichenden Objekte
  • ist
  • IEquatable<T>.Equals sollte sich immer wie object.Equals verhalten, aber wenn der statische Typ der Objekte T ist, bietet es eine etwas bessere Leistung

Was bedeutet das alles in der Praxis?

Als Faustregel sollten Sie Equals verwenden, um nach Gleichheit zu suchen ( object.Equals nach Bedarf zu überschreiben) und auch IEquatable<T> implementieren, um eine etwas bessere Leistung zu erzielen. In diesem Fall sollte object.Equals in IEquatable<T>.Equals implementiert werden.

Für einige spezifische Typen (wie System.String ) ist es auch akzeptabel, operator== zu verwenden, obwohl Sie darauf achten müssen, keine "polymorphen Vergleiche" zu machen. Die Equals -Methoden dagegen funktionieren auch dann korrekt, wenn Sie solche Vergleiche durchführen.

Sie können ein Beispiel für einen polymorphen Vergleich sehen und warum es ein Problem sein kann hier .

Vergessen Sie nicht, dass Sie, wenn Sie object.Equals überschreiben, auch object.GetHashCode entsprechend überschreiben müssen.

    
Jon 06.12.2011 12:57
quelle
4

Eine Möglichkeit besteht darin, IEquatable<T>

zu implementieren %Vor%

Sie können auch die Equals (Objekt) -Methode (aus System.Object) überschreiben, wenn Sie dies tun, sollten Sie auch GetHashCode Sehen Sie hier

    
Patrick McDonald 06.12.2011 12:49
quelle
1

Sie können die equals-Methode überschreiben und darin manuell die Objekte

vergleichen

Sehen Sie sich auch die Richtlinien zum Überladen von Equals () und Operator an ==

    
Haris Hasan 06.12.2011 12:45
quelle
1

Sie müssen die Regeln definieren, die Objekt A gleich Objekt B machen und dann den Equals-Operator für diesen Typ überschreiben.

Ссылка

    
DaveRead 06.12.2011 12:45
quelle
1

Zuallererst ist die Gleichheit schwierig zu definieren, und nur Sie können definieren, was Gleichheit für Sie bedeutet

  1. Bedeutet dies, dass Mitglieder denselben Wert haben
  2. Oder sie zeigen auf denselben Ort.

Hier ist eine Diskussion und eine Antwort hier

Was ist "Best Practice"? "Zum Vergleich zweier Instanzen eines Referenztyps?

    
user182630 06.12.2011 12:52
quelle
1

Implementiere die IEquatable<T> interface . Dies definiert eine verallgemeinerte Methode, die ein Werttyp oder eine Klasse implementiert, um eine typspezifische Methode zur Bestimmung der Instanzengleichheit zu erstellen. Mehr Informationen hier:

Ссылка

    
Enigma State 06.12.2011 12:46
quelle

Tags und Links