CA1815: Přepište rovná se a operátor rovnosti na hodnotových typech
TypeName |
OverrideEqualsAndOperatorEqualsOnValueTypes |
CheckId |
CA1815 |
Kategorie |
Microsoft.Performance |
Narušující změna |
Nenarušující |
Příčina
Typ veřejné hodnoty nepřepisuje Object.Equals nebo neobsahuje implementaci operátoru rovnosti (==).Toto pravidlo nekontroluje výčtové typy.
Popis pravidla
Pro hodnotové typy, zděděná implementace Equals používá knihovnu reflexe a porovnává obsah všech polí.Reflexe je výpočetně náročná a porovnání rovnosti všech polí může být zbytečné.Pokud bude od uživatelů očekáváno porovnávání nebo třídění instancí nebo jejich využití k vytvoření hash klíčů pro tabulky, měla by tato hodnota implementovat Equals.Pokud programovací jazyk podporuje přetížení operátoru, měla by být k dispozici také implementace operátorů rovnosti a nerovnosti.
Jak vyřešit porušení
K nápravě porušení tohoto pravidla implementujte Equals.Pokud je to možné, implementujte operátor rovnosti.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění tohoto pravidla, pokud nebudou instance typu hodnoty navzájem porovnány.
Příklad porušení
Description
Následující příklad ukazuje strukturu (typ hodnoty), která toto pravidlo porušuje.
Kód
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; }
}
}
}
Příklad opravy
Description
Následující příklad řeší předchozí porušení předchozí přepsáním ValueType.Equals a implementováním operátorů porovnání rovnosti (==,! =).
Kód
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);
}
}
}
Související pravidla
CA2224: Přepište Equals při přetížení operátoru rovnosti
CA2231: Přetižte operátor equals při přepsání ValueType.Equals
CA2226: Operátory by měly mít symetrické přetížení