CA1828: Använd inte CountAsync/LongCountAsync när AnyAsync kan användas
Property | Värde |
---|---|
Regel-ID | CA1828 |
Title | Använd inte CountAsync/LongCountAsync när AnyAsync kan användas |
Kategori | Prestanda |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
Metoden CountAsync eller LongCountAsync användes där AnyAsync metoden skulle vara effektivare.
Regelbeskrivning
Den här regeln flaggar anropen CountAsync och LongCountAsync LINQ-metoden som används för att kontrollera om samlingen har minst ett element. Dessa metodanrop kräver att hela samlingen räknas upp för att beräkna antalet. Samma kontroll går snabbare med AnyAsync metoden eftersom den undviker att räkna upp samlingen.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse ersätter du metodanropet CountAsync eller LongCountAsync med AnyAsync -metoden. Följande två kodfragment visar till exempel ett brott mot regeln och hur du åtgärdar den:
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";
}
Dricks
En kodkorrigering är tillgänglig för den här regeln i Visual Studio. Om du vill använda den placerar du markören på överträdelsen och trycker på Ctrl+. (punkt). Välj Använd inte CountAsync() eller LongCountAsync() när AnyAsync() kan användas i listan över alternativ som visas.
När du ska ignorera varningar
Det är säkert att förhindra en överträdelse av den här regeln om du inte bryr dig om prestandapåverkan från onödig samlingsuppräkning för att beräkna antalet.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1828
// The code that's violating the rule is on this line.
#pragma warning restore CA1828
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1828.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Relaterade regler
- CA1826: Använd egenskapen i stället för Linq Enumerable-metoden
- CA1827: Använd inte Count/LongCount när alla kan användas
- CA1829: Använd egenskapen Length/Count i stället för metoden Enumerable.Count