CA2231: De operator Overbelasting is gelijk aan het overschrijven van ValueType.Equals
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2231 |
Titel | Operator Voor overbelasting is gelijk aan het overschrijven van ValueType.Equals |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Een waardetype overschrijft, maar implementeert de gelijkheidsoperator System.Object.Equals niet.
Deze regel kijkt standaard alleen naar extern zichtbare typen, maar dit kan worden geconfigureerd.
Beschrijving van regel
In de meeste programmeertalen is er geen standaard implementatie van de gelijkheidsoperator (==) voor waardetypen. Als uw programmeertaal overbelasting van operatoren ondersteunt, kunt u overwegen de gelijkheidsoperator te implementeren. Het gedrag moet identiek zijn aan die van Equals.
U kunt de standaard gelijkheidsoperator niet gebruiken in een overbelaste implementatie van de gelijkheidsoperator. Als u dit doet, wordt een stack-overloop veroorzaakt. Als u de gelijkheidsoperator wilt implementeren, gebruikt u de methode Object.Equals in uw implementatie. Voorbeeld:
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);
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, implementeert u de gelijkheidsoperator.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken; We raden u echter aan de gelijkheidsoperator indien mogelijk op te geven.
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 CA2231
// The code that's violating the rule is on this line.
#pragma warning restore CA2231
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.CA2231.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 (gebruik) 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
In het volgende voorbeeld wordt een type gedefinieerd dat in strijd is met deze regel:
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));
}
}
Gerelateerde regels
- CA1046: Operator voor overbelasting is niet gelijk aan verwijzingstypen
- CA2225: Overbelastingen van operatoren hebben alternatieve namen
- CA2226: Operators moeten symmetrische overbelastingen hebben