CA1815: Az értéktípusok felülbírálása egyenlő, az operátor pedig egyenlő
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1815 |
Cím | Az értéktípusok felülbírálása egyenlő, az operátor pedig egyenlő |
Kategória | Teljesítmény |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
Az értéktípus nem bírálja felül System.Object.Equals vagy nem valósítja meg az egyenlőségi operátort (==). Ez a szabály nem ellenőrzi az enumerálásokat.
Ez a szabály alapértelmezés szerint csak külsőleg látható típusokat tekint meg, de ez konfigurálható.
Szabály leírása
Nem titkos értéktípusok esetén az örökölt implementáció Equals a System.Reflection kódtár használatával hasonlítja össze az összes mező tartalmát. Önkifejezés számítás költséges, és az egyenlőség minden mezőjének összehasonlítása szükségtelen lehet. Ha arra számít, hogy a felhasználók összehasonlítják vagy rendezik a példányokat, vagy kivonattáblakulcsként használják őket, az értéktípusnak implementálnia Equalskell. Ha a programozási nyelv támogatja az operátorok túlterhelését, akkor az egyenlőségi és egyenlőtlenségi operátorok megvalósítását is biztosítania kell.
Szabálysértések kijavítása
A szabály megsértésének kijavításához adja meg a szabály implementálását Equals. Ha lehet, valósítsa meg az egyenlőség operátort.
Mikor kell letiltani a figyelmeztetéseket?
A szabály figyelmeztetését nyugodtan letilthatja, ha az értéktípus példányai nem lesznek összehasonlítva egymással.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Kód konfigurálása elemzéshez
A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezt a beállítást konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában (Teljesítmény) érvényes összes szabályra. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott API-felületek belefoglalása
A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Példa
Az alábbi kód egy olyan struktúrát (értéktípust) mutat be, amely megsérti ezt a szabályt:
// Violates this rule
public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
Az alábbi kód az egyenlőségi operátorok (==
és !=
) felülírásával System.ValueType.Equals és implementálásával oldja meg az előző jogsértést:
public struct Point : IEquatable<Point>
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
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);
}
}
Kapcsolódó szabályok
- CA2231: A túlterhelési operátor egyenlő a ValueType.Equals felülbírálásával
- CA2226: Az operátoroknak szimmetrikus túlterhelésekkel kell rendelkezniük