CA1066: „IEquatable“ beim Außerkraftsetzen von „Equals“ implementieren
Eigenschaft | Wert |
---|---|
Regel-ID | CA1066 |
Titel | „IEquatable“ beim Außerkraftsetzen von „Equals“ implementieren |
Kategorie | Design |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 9 aktiviert | No |
Ursache
Ein Wertetyp („struct“) überschreibt die Methode Equals, implementiert aber nicht IEquatable<T>.
Regelbeschreibung
Ein Wertetyp, der die Methode Equals überschreibt, zeigt an, dass er den Vergleich zweier Instanzen des Typs auf Wertgleichheit unterstützt. Sie sollten erwägen, die IEquatable<T>-Schnittstelle zu implementieren, um stark typisierte Tests auf Gleichheit zu unterstützen. Dadurch wird sichergestellt, dass Aufrufer, die Gleichheitstests durchführen, die stark typisierte System.IEquatable<T>.Equals-Methode aufrufen und das Boxing des Arguments vermeiden, was die Leistung verbessert. Weitere Informationen finden Sie hier.
Ihre System.IEquatable<T>.Equals-Implementierung sollte Ergebnisse zurückgeben, die Equals entsprechen.
Behandeln von Verstößen
Um einen Verstoß zu beheben, implementieren Sie IEquatable<T> und aktualisieren Sie den Equals-Override, um diese implementierte Methode aufzurufen. Die folgenden beiden Codeausschnitte zeigen z. B. einen Verstoß gegen die Regel und wie dieser korrigiert werden kann:
public struct S
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && _value == otherS._value;
}
using System;
public struct S : IEquatable<S>
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && Equals(otherS);
public bool Equals(S other)
=> _value == other._value;
}
Wann sollten Warnungen unterdrückt werden?
Es ist in Ordnung, Verstöße gegen diese Regel zu unterdrücken, wenn die Entwurfs- und Leistungsvorteile der Implementierung der Schnittstelle nicht von entscheidender Bedeutung sind.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.