Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA1868 |
| Tytuł | Niepotrzebne wywołanie funkcji "Contains" dla zestawów |
| Kategoria | Wydajność |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Połączenie ISet<T>.Add lub ICollection<T>.Remove jest chronione przez wywołanie metody Contains. Wywołanie IImmutableSet<T>.Add albo IImmutableSet<T>.Remove jest chronione przez wywołanie IImmutableSet<T>.Contains.
Opis reguły
Zarówno ISet<T>.Add(T), jak i ICollection<T>.Remove(T) wykonują wyszukiwanie, co sprawia, że wywołanie ICollection<T>.Contains(T) wcześniej jest zbędne. Bardziej wydajne jest bezpośrednie wywołanie Add(T) lub Remove(T), które zwraca wartość logiczną wskazującą, czy element został dodany lub usunięty.
Ta logika ma zastosowanie także do IImmutableSet<T>.Add(T) i IImmutableSet<T>.Remove(T), z tym wyjątkiem, że zwracają nowy zestaw, jeśli element jest dodany lub usunięty, albo oryginalny zestaw, jeśli nie jest.
Jak naprawić naruszenia
Zastąp wywołanie metody ICollection<T>.Contains(T) (lub IImmutableSet<T>.Contains(T)), po którym następuje wywołanie metody ISet<T>.Add(T) lub ICollection<T>.Remove(T) (lub IImmutableSet<T>.Add(T) lub 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.