CA1815: Onderdrukking is gelijk aan en operator is gelijk aan waardetypen
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1815 |
Titel | Onderdrukking is gelijk aan en operator is gelijk aan waardetypen |
Categorie | Prestaties |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een waardetype overschrijft System.Object.Equals niet of implementeert de gelijkheidsoperator (==). Met deze regel worden opsommingen niet gecontroleerd.
Deze regel kijkt standaard alleen naar extern zichtbare typen, maar dit kan worden geconfigureerd.
Beschrijving van regel
Voor niet-belichte waardetypen wordt de overgenomen implementatie van Equals de System.Reflection bibliotheek gebruikt om de inhoud van alle velden te vergelijken. Weerspiegeling is rekenkrachtig en het vergelijken van elk veld voor gelijkheid kan onnodig zijn. Als u verwacht dat gebruikers instanties vergelijken of sorteren, of deze gebruiken als hashtabelsleutels, moet uw waardetype worden geïmplementeerd Equals. Als uw programmeertaal overbelasting van operatoren ondersteunt, moet u ook een implementatie bieden van de operatoren voor gelijkheid en ongelijkheid.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, geeft u een implementatie van Equals. Als u dat kunt, implementeert u de gelijkheidsoperator.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als exemplaren van het waardetype niet met elkaar worden vergeleken.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (prestaties) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Specifieke API-oppervlakken opnemen
U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Opmerking
De volgende code toont een structuur (waardetype) die deze regel schendt:
// Violates this rule
public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
Met de volgende code wordt de vorige schending opgelost door de gelijkheidsoperators (en!=
) te overschrijven System.ValueType.Equals en te implementeren:==
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);
}
}
Gerelateerde regels
- CA2231: De operator Overbelasting is gelijk aan het overschrijven van ValueType.Equals
- CA2226: Operators moeten symmetrische overbelastingen hebben