Udostępnij za pośrednictwem


CA1828: Nie używaj funkcji CountAsync/LongCountAsync, gdy można użyć narzędzia AnyAsync

Właściwości Wartość
Identyfikator reguły CA1828
Tytuł Nie używaj funkcji CountAsync/LongCountAsync, gdy można użyć funkcji AnyAsync
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

Metoda CountAsync lub LongCountAsync została użyta tam, gdzie metoda AnyAsync byłaby bardziej wydajna.

Opis reguły

Ta reguła oznacza wywołania metod LINQ CountAsync i LongCountAsync używane do sprawdzania, czy kolekcja ma co najmniej jeden element. Te wywołania metody wymagają wyliczenia całej kolekcji w celu obliczenia liczby. To samo sprawdzenie jest szybsze metodą AnyAsync, unikając wyliczania kolekcji.

Jak naprawić naruszenia

Aby naprawić naruszenie, zastąp wywołanie metody CountAsync lub LongCountAsync metodą AnyAsync. Na przykład następujące dwa fragmenty kodu pokazują naruszenie reguły i sposób jego naprawy:

using System.Linq;
using System.Threading.Tasks;
using static Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions;

class C
{
    public async Task<string> M1Async(IQueryable<string> list)
        => await list.CountAsync() != 0 ? "Not empty" : "Empty";

    public async Task<string> M2Async(IQueryable<string> list)
        => await list.LongCountAsync() > 0 ? "Not empty" : "Empty";
}
using System.Linq;
using System.Threading.Tasks;
using static Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions;

class C
{
    public async Task<string> M1Async(IQueryable<string> list)
        => await list.AnyAsync() ? "Not empty" : "Empty";

    public async Task<string> M2Async(IQueryable<string> list)
        => await list.AnyAsync() ? "Not empty" : "Empty";
}

Wskazówka

Poprawka kodu jest dostępna dla tej reguły w programie Visual Studio. Aby go użyć, umieść kursor na naruszeniu i naciśnij Ctrl+. (kropka). Wybierz pozycję Nie używaj funkcji CountAsync() ani LongCountAsync(), gdy można użyć metody AnyAsync() z listy przedstawionych opcji.

Poprawka kodu dla ca1828 — nie używaj funkcji CountAsync() ani LongCountAsync(), gdy można użyć metody AnyAsync()

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć naruszenie tej reguły, jeśli nie martwisz się o wpływ na wydajność związany z niepotrzebnym wyliczaniem kolekcji w celu obliczenia ilości.

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

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

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

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

Zobacz też