Überladen Sie den Gleichheitsoperator beim Überschreiben von ValueType.Equals
Aktualisiert: November 2007
TypeName |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
CheckId |
CA2231 |
Kategorie |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Werttyp überschreibt Object.Equals, implementiert jedoch den Gleichheitsoperator nicht.
Regelbeschreibung
In den meisten Programmiersprachen gibt es keine Standardimplementierung des Gleichheitsoperators (==) für Werttypen. Wenn die verwendete Programmiersprache Operatorüberladungen unterstützt, sollten Sie erwägen, den Gleichheitsoperator zu implementieren. Das Verhalten des Gleichheitsoperators sollte mit dem von Equals übereinstimmen.
Sie können den Standardgleichheitsoperator nicht in einer überladenen Implementierung des Gleichheitsoperators verwenden. Eine solche Vorgehensweise führt zu einem Stapelüberlauf. Verwenden Sie zur Implementierung des Gleichheitsoperators die Object.Equals-Methode. Beispiel:
If (Object.ReferenceEquals(left, Nothing)) Then
Return Object.ReferenceEquals(right, Nothing)
Else
Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null))
return Object.ReferenceEquals(right, null);
return left.Equals(right);
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie den Gleichheitsoperator.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden. Es wird jedoch empfohlen, den Gleichheitsoperator bereitzustellen, falls dies möglich ist.
Beispiel
Im folgenden Beispiel wird ein Typ definiert, der gegen diese Regel verstößt.
using System;
namespace UsageLibrary
{
public struct PointWithoutHash
{
private int x,y;
public PointWithoutHash(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return String.Format("({0},{1})",x,y);
}
public int X {get {return x;}}
public int Y {get {return x;}}
// Violates rule: OverrideGetHashCodeOnOverridingEquals.
// Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals.
public override bool Equals (object obj)
{
if (obj.GetType() != typeof(PointWithoutHash))
return false;
PointWithoutHash p = (PointWithoutHash)obj;
return ((this.x == p.x) && (this.y == p.y));
}
}
}
Verwandte Regeln
Gleichheitsoperator bei Referenztypen nicht überladen
Operatorüberladungen haben benannte Alternativen
Operatoren sollten symmetrische Überladungen haben
Equals beim Überladen des Gleichheitsoperators überschreiben
GetHashCode beim Überschreiben von Equals überschreiben