CA1066: Implementowanie funkcji IEquatable podczas zastępowania wartości Equals
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1066 |
Tytuł | Zaimplementuj interfejs IEquatable przy przesłanianiu metody Equals |
Kategoria | Projekt |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Metoda zastępowania typu wartości (struct), ale nie implementuje Equals IEquatable<T>metody .
Opis reguły
Metoda zastępowania Equals typu wartości wskazuje, że obsługuje porównywanie dwóch wystąpień typu pod kątem równości wartości. Rozważ zaimplementowanie interfejsu w IEquatable<T> celu obsługi silnie typiowanych testów pod kątem równości. Dzięki temu osoby wywołujące wykonujące kontrole równości wywołują silnie typizowana System.IEquatable<T>.Equals metodę i unikają tworzenia pola argumentu, co poprawia wydajność. Więcej informacji można znaleźć tutaj.
Implementacja System.IEquatable<T>.Equals powinna zwracać wyniki zgodne z .Equals
Jak naprawić naruszenia
Aby naprawić naruszenie, zaimplementuj IEquatable<T> i zaktualizuj Equals przesłonięcia, aby wywołać tę zaimplementowaną metodę. Na przykład następujące dwa fragmenty kodu pokazują naruszenie reguły i sposób jego naprawy:
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;
}
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć naruszenia z tej reguły, jeśli korzyści z projektowania i wydajności z implementacji interfejsu nie są krytyczne.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.