CA1828: Nepoužívejte CountAsync/LongCountAsync, pokud je možné použít AnyAsync

Vlastnost Hodnota
ID pravidla CA1828
Název Nepoužívejte CountAsync/LongCount, když se dá použít AnyAsync
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Použili CountAsync jsme metoduAnyAsync, LongCountAsync ve které by byla metoda efektivnější.

Popis pravidla

Toto pravidlo označí CountAsync volání metody LINQ LongCountAsync a používá se ke kontrole, jestli kolekce obsahuje alespoň jeden prvek. Tato volání metody vyžadují výčet celé kolekce pro výpočet počtu. Stejná kontrola je u metody rychlejší AnyAsync , protože se vyhne výčet kolekce.

Jak opravit porušení

Chcete-li opravit porušení, nahraďte CountAsync volání metody metodou AnyAsyncLongCountAsync. Například následující dva fragmenty kódu ukazují porušení pravidla a postup jeho opravy:

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";
}

Tip

Oprava kódu je k dispozici pro toto pravidlo v sadě Visual Studio. Pokud ho chcete použít, umístěte kurzor na porušení a stiskněte ctrl+. (tečka). Zvolte Možnost Nepoužívat CountAsync() nebo LongCountAsync(), pokud je možné použít anyAsync() ze seznamu zobrazených možností.

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

Kdy potlačit upozornění

Je bezpečné potlačit porušení tohoto pravidla, pokud vás nezajímá dopad na výkon z nepotřebného výčtu kolekce pro výpočet počtu.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA1828
// The code that's violating the rule is on this line.
#pragma warning restore CA1828

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také