CA2231: Přetižte operátor equals při přepsání ValueType.Equals
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2231 |
Název | Přetižte operátor rovnosti při přetížení ValueType.Equals |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
Typ hodnoty přepíše System.Object.Equals , ale neimplementuje operátor rovnosti.
Ve výchozím nastavení toto pravidlo sleduje jenom externě viditelné typy, ale dá se konfigurovat.
Popis pravidla
Ve většině programovacích jazyků neexistuje výchozí implementace operátoru rovnosti (==) pro typy hodnot. Pokud programovací jazyk podporuje přetížení operátorů, měli byste zvážit implementaci operátoru rovnosti. Jeho chování by mělo být stejné jako chování .Equals
Výchozí operátor rovnosti nelze použít v přetížené implementaci operátoru rovnosti. Tím dojde k přetečení zásobníku. K implementaci operátoru rovnosti použijte v implementaci metodu Object.Equals. Příklad:
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 opravit porušení
Chcete-li opravit porušení tohoto pravidla, implementujte operátor rovnosti.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění z tohoto pravidla; pokud je to však možné, doporučujeme zadat operátor rovnosti.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2231
// The code that's violating the rule is on this line.
#pragma warning restore CA2231
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2231.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Konfigurace kódu pro analýzu
Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.
Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (použití), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Zahrnutí konkrétních povrchů rozhraní API
Na základě přístupnosti můžete nakonfigurovat, na kterých částech základu kódu se má toto pravidlo spouštět. Pokud chcete například určit, že pravidlo by se mělo spouštět jenom na neveřejné ploše rozhraní API, přidejte do souboru .editorconfig v projektu následující pár klíč-hodnota:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Poznámka
Nahraďte XXXX
část CAXXXX
ID příslušného pravidla.
Příklad
Následující příklad definuje typ, který porušuje toto pravidlo:
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));
}
}
Související pravidla
- CA1046: Nepřetěžujte operátory rovnosti na odkazových typech
- CA2225: Přetížení operátoru mají pojmenované alternativy
- CA2226: Operátory by měly mít symetrické přetížení