Compartilhar via


CA1828: Não usar CountAsync/LongCountAsync quando AnyAsync puder ser usado

Property Valor
ID da regra CA1828
Título Não usar CountAsync/LongCountAsync quando AnyAsync puder ser usado
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

O método CountAsync ou LongCountAsync foi usado, quando o método AnyAsync seria mais eficiente.

Descrição da regra

Essa regra sinaliza as chamadas de método LINQ CountAsync e LongCountAsync usadas para verificar se a coleção tem pelo menos um elemento. Essas chamadas de método exigem a enumeração de toda a coleção para calcular a contagem. A mesma verificação é mais rápida com o método AnyAsync, pois ele evita enumerar a coleção.

Como corrigir violações

Para corrigir uma violação, substitua a chamada de método CountAsyncou LongCountAsync pelo método AnyAsync. Por exemplo, os dois snippets de código a seguir mostram uma violação da regra e como corrigi-la:

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

Dica

Uma correção de código está disponível para essa regra no Visual Studio. Para usá-la, posicione o cursor sobre a violação e pressione Ctrl+. (ponto). Escolha Não usar CountAsync() ou LongCountAsync() quando AnyAsync() puder ser usado na lista de opções apresentadas.

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

Quando suprimir avisos

É seguro suprimir uma violação dessa regra se você não estiver preocupado com o impacto no desempenho da enumeração de coleção desnecessária para calcular a contagem.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Confira também