CA1868: Niepotrzebne wywołanie funkcji "Contains" dla zestawów

Właściwości Wartość
Identyfikator reguły CA1868
Tytuł Niepotrzebne wywołanie funkcji "Contains" dla zestawów
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Połączenie ISet<T>.Add lub ICollection<T>.Remove jest chronione przez wywołanie metody Contains. Albo wywołanie IImmutableSet<T>.Add metody lub IImmutableSet<T>.Remove jest chronione przez wywołanie metody IImmutableSet<T>.Contains.

Opis reguły

Zarówno ISet<T>.Add(T) , jak i ICollection<T>.Remove(T) wykonaj wyszukiwanie, co sprawia, że jest ono nadmiarowe do wywołania ICollection<T>.Contains(T) wcześniej. Bardziej wydajne jest wywołanie Add(T) lub Remove(T) bezpośrednie zwrócenie wartości logicznej wskazującej, czy element został dodany, czy usunięty.

Ta logika dotyczy IImmutableSet<T>.Add(T) również elementów i IImmutableSet<T>.Remove(T), z tą różnicą, że zwracają nowy zestaw, jeśli element został dodany lub usunięty, albo oryginalny zestaw, jeśli nie został.

Jak naprawić naruszenia

Zastąp wywołanie metody ICollection<T>.Contains(T) (lub IImmutableSet<T>.Contains(T)), po której następuje wywołanie ISet<T>.Add(T) metody lub ICollection<T>.Remove(T) (lub lub IImmutableSet<T>.Add(T)IImmutableSet<T>.Remove(T)) pojedynczym wywołaniem tej drugiej metody.

Przykład

Poniższy fragment kodu przedstawia naruszenie ca1868:

void Run(ISet<string> set)
{
    if (!set.Contains("Hello World"))
    {
        set.Add("Hello World");
    }
}
Sub Run(set As ISet(Of String))
    If Not set.Contains("Hello World") Then
        set.Add("Hello World")
    End If
End Sub

Poniższy fragment kodu naprawia naruszenie:

void Run(ISet<string> set)
{
    set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
    set.Add("Hello World")
End Sub

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć to ostrzeżenie, jeśli wydajność nie jest problemem.

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 CA1868
// The code that's violating the rule is on this line.
#pragma warning restore CA1868

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA1868.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.