CA1828: Não use CountAsync/LongCountAsync quando AnyAsync pode ser usado
Property | valor |
---|---|
ID da regra | CA1828 |
Título | Não use CountAsync/LongCountAsync quando AnyAsync pode ser usado |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Como sugestão |
Motivo
O CountAsync método or LongCountAsync foi utilizado onde o AnyAsync método seria mais eficiente.
Descrição da regra
Esta regra sinaliza as chamadas do CountAsync método LINQ 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 AnyAsync método, pois evita enumerar a coleção.
Como corrigir violações
Para corrigir uma violação, substitua a CountAsync chamada de método ou LongCountAsync pelo AnyAsync método. Por exemplo, os dois trechos 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";
}
Gorjeta
Uma correção de código está disponível para essa regra no Visual Studio. Para usá-lo, posicione o cursor sobre a violação e pressione Ctrl+. Escolha Não usar CountAsync() ou LongCountAsync() quando AnyAsync() puder ser usado na lista de opções apresentada.
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 coleta desnecessária para calcular a contagem.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 para um arquivo, pasta ou projeto, defina sua severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1828.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Regras conexas
- CA1826: Use a propriedade em vez do método Linq Enumerable
- CA1827: Não use Count/LongCount quando algum pode ser usado
- CA1829: Use a propriedade Length/Count em vez do método Enumerable.Count