CA2231: Przeciąż operator equals przy zastępowaniu ValueType.Equals
TypeName |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
CheckId |
CA2231 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ wartości zastępuje Object.Equals , ale nie implementuje operatora równości.
Opis reguły
W większości języków programowania nie ma domyślnej implementacji operatora równości (==) dla typów wartości.Jeśli język programowania obsługuje przeciążenie operatorów, należy rozważyć implementację operatora równości.Jego zachowanie powinno być identyczne z Equals.
Nie można używać domyślnego operatora równości w przeciążonej implementacji operatora równości.Spowoduje to przepełnienie stosu.Aby zaimplementować operator równości, należy użyć metody Object.Equals w implementacji.Na przykład:
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);
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zaimplementować operator równości.
Kiedy pominąć ostrzeżenia
Można bezpiecznie wyłączyć ostrzeżenia od tej zasady; jednak zaleca się, aby zapewnić operator równości jeśli to możliwe.
Przykład
W poniższym przykładzie zdefiniowano typ, który narusza tą regułę.
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));
}
}
}
Powiązane reguły
CA1046: Nie przeciążaj operatora equals w typach referencyjnych
CA2225: Operator overloads ma nazwanych zastępców
CA2226: Operatory powinny być przeciążane symetrycznie
CA2224: Zastąp metodę equals przeciążając operator equals
CA2218: Zastąp GetHashCode przy zastępowaniu Equals