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 powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

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

Opis reguły

Ta reguła flaguje CountAsync wywołania metody i LongCountAsync LINQ 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 w AnyAsync przypadku metody, ponieważ pozwala uniknąć wyliczania kolekcji.

Jak naprawić naruszenia

Aby naprawić naruszenie, zastąp CountAsync wywołanie AnyAsync metody or LongCountAsync metodą metodą . 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";
}

Napiwek

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

Code fix for CA1828 - Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć naruszenie tej reguły, jeśli nie martwisz się o wpływ wydajności z niepotrzebnego wyliczenia kolekcji na obliczenie liczby.

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ż