2009-03-06 6 views
5

den Vergleichsoperator Überlastung, wie zu vergleichen, wenn die beiden Variablen Punkte auf das gleiche Objekt (d.h. Nicht Wert)Nach dem Überladen des Operators ==, wie zu vergleichen, wenn zwei Variablen auf das gleiche Objekt zeigt?

public static bool operator ==(Landscape a, Landscape b) 
{ 
    return a.Width == b.Width && a.Height == b.Height; 
} 

public static bool operator !=(Landscape a, Landscape b) 
{ 
    return !(a.Width == b.Width && a.Height == b.Height); 
} 
+1

Ich versuche, diese Operatoren für Referenztypen zu überlasten, da die meisten Menschen == erwarten, um die Objektgleichheit zu testen. –

Antwort

8

Verwenden der Object.ReferenceEquals statische Methode.

Damit die == und! = -Methode ihre volle Funktionalität beibehält, sollten Sie natürlich Equals und GetHashCode überschreiben, damit sie eine konsistente Reihe von Antworten an die Aufrufer zurückgeben.

4
+0

'ReferenceEquals (object, object)' ist eine statische Methode der 'Object' Klasse und kann nicht so verwendet werden, es sei denn, Sie schreiben eine Erweiterungsmethode dafür. Um es zu benutzen, muss man aufrufen: 'object.ReferenceEquals (a, b)' –

4

Um zu prüfen, ob beide auf dasselbe Objekt zeigen. Sie sollten die Methode Object.ReferenceEquals verwenden. Es wird wahr zurückgegeben, wenn beide gleich sind oder wenn beide null sind. Sonst gibt es false zurück

0

Ich weiß, es ist eine alte Frage, aber wenn Sie die Methode == oder Object.Equals überladen, sollten Sie auch den Reverse-Operator! = Überladen. In diesem Fall sollten Sie, da Sie interne Zahlen vergleichen, die anderen Vergleichsoperatoren <,>, < =,> = überladen.

Personen, die Ihre Klasse in der Zukunft konsumieren, egal ob es sich um Drittanwender oder Entwickler handelt, die Code übernehmen, verwenden möglicherweise CodeRush oder Refactor, der die Logik automatisch umkehrt (auch als Umkehrung bezeichnet) die Bedingung) und dann flacht es ab, um aus dem verschachtelten if-Syndrom auszubrechen. Wenn ihr Code dies tut und Sie den Operator == überladen haben, ohne den Operator! = Zu überladen, könnte dies die beabsichtigte Bedeutung Ihres Codes ändern.

Verwandte Themen