CA2231: A túlterhelési operátor egyenlő a ValueType.Equals felülbírálásával
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA2231 |
Cím | A túlterhelési operátor egyenlő a ValueType.Equals felülbírálásával |
Kategória | Használat |
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 | Javaslatként |
Ok
Az értéktípus felülbírál, System.Object.Equals de nem valósítja meg az egyenlőségi operátort.
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
A legtöbb programozási nyelvben nincs alapértelmezett implementációja az egyenlőségi operátornak (==) az értéktípusokhoz. Ha a programozási nyelv támogatja az operátorok túlterhelését, érdemes megfontolni az egyenlőségi operátor implementálását. A viselkedésének meg kell egyeznie Equalsa .
Az egyenlőségi operátor túlterhelt megvalósításában nem használhatja az alapértelmezett egyenlőségi operátort. Ha így tesz, akkor a verem túlcsordul. Az egyenlőségi operátor implementálásához használja az Object.Equals metódust a megvalósításban. Például:
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);
Szabálysértések kijavítása
A szabály megsértésének kijavításához hajtsa végre az egyenlőségi operátort.
Mikor kell letiltani a figyelmeztetéseket?
A szabályból származó figyelmeztetéseket nyugodtan el lehet tiltani; javasoljuk azonban, hogy lehetőség szerint adja meg az egyenlőségi operátort.
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 CA2231
// The code that's violating the rule is on this line.
#pragma warning restore CA2231
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.CA2231.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 (Használat) é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 példa egy olyan típust határoz meg, amely megsérti ezt a szabályt:
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));
}
}
Kapcsolódó szabályok
- CA1046: Ne terhelje túl az operátort a referenciatípusoknál
- CA2225: Az operátorok túlterhelései alternatívokat neveztek el
- CA2226: Az operátoroknak szimmetrikus túlterhelésekkel kell rendelkezniük
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: