CA1815: Zastąp metodę equals i operator równości dla typów wartości
TypeName |
OverrideEqualsAndOperatorEqualsOnValueTypes |
CheckId |
CA1815 |
Kategoria |
Microsoft.Performance |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Publiczny typ wartości nie zastępuje Object.Equals, lub nie implementuje operatora równości (==).Ta reguła nie sprawdza wyliczeń.
Opis reguły
Dla typów wartości, dziedziczony implementacja Equals używa biblioteki refleksji i porównuje zawartość wszystkich pól.Odbicie jest obliczeniowo kosztowne, a porównanie równości każdego pola może być niepotrzebne.Jeśli oczekuje się, że użytkownicy będą porównywać lub sortować wystąpienia lub używać ich jako kluczy tabeli mieszania, typ wartości powinien zaimplementować Equals.Jeśli język programowania obsługuje przeciążanie operatorów, należy również dostarczyć implementację operatorów równości i nierówności.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, dostarcz implementację Equals.Jeśli jest to możliwe, należy zaimplementować operator równości.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli wystąpienia typu wartości nie będą porównywane ze sobą.
Przykład naruszenia
Opis
Poniższy przykład pokazuje strukturę (typ wartości) naruszający tę regułę.
Kod
using System;
namespace Samples
{
// Violates this rule
public struct Point
{
private readonly int _X;
private readonly int _Y;
public Point(int x, int y)
{
_X = x;
_Y = y;
}
public int X
{
get { return _X; }
}
public int Y
{
get { return _Y; }
}
}
}
Przykład sposobu wprowadzenia poprawki
Opis
Poniższy przykład rozwiązuje poprzednie naruszenie zastępując ValueType.Equals i implementując operatory równości (==, !=).
Kod
using System;
namespace Samples
{
public struct Point : IEquatable<Point>
{
private readonly int _X;
private readonly int _Y;
public Point(int x, int y)
{
_X = x;
_Y = y;
}
public int X
{
get { return _X; }
}
public int Y
{
get { return _Y; }
}
public override int GetHashCode()
{
return _X ^ _Y;
}
public override bool Equals(object obj)
{
if (!(obj is Point))
return false;
return Equals((Point)obj);
}
public bool Equals(Point other)
{
if (_X != other._X)
return false;
return _Y == other._Y;
}
public static bool operator ==(Point point1, Point point2)
{
return point1.Equals(point2);
}
public static bool operator !=(Point point1, Point point2)
{
return !point1.Equals(point2);
}
}
}
Powiązane reguły
CA2224: Zastąp metodę equals przeciążając operator equals
CA2231: Przeciąż operator equals przy zastępowaniu ValueType.Equals
CA2226: Operatory powinny być przeciążane symetrycznie