CA1828: CountAsync/LongCountAsync nicht verwenden, wenn AnyAsync verwendet werden kann.

Eigenschaft Wert
Regel-ID CA1828
Titel CountAsync/LongCountAsync nicht verwenden, wenn AnyAsync verwendet werden kann.
Kategorie Leistung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Die Methode CountAsync oder LongCountAsync wurde verwendet, obwohl die Methode AnyAsync effizienter gewesen wäre.

Regelbeschreibung

Diese Regel kennzeichnet die verwendeten CountAsync und LongCountAsync LINQ-Methodenaufrufe, um zu überprüfen, ob die Auflistung mindestens ein Element hat. Diese Methodenaufrufe erfordern das Auflisten der gesamten Auflistung, um die Anzahl zu berechnen. Die gleiche Überprüfung ist mit der AnyAsync-Methode schneller, da sie die Enumerierung der Auflistung vermeidet.

Behandeln von Verstößen

Um einen Verstoß zu beheben, ersetzen Sie die CountAsync- oder LongCountAsync-Methodenaufrufe mit der AnyAsync-Methode. Die folgenden beiden Codeausschnitte zeigen z. B. einen Verstoß gegen die Regel und wie dieser korrigiert werden kann:

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

Tipp

Für diese Regel ist ein Codefix in Visual Studio verfügbar. Um ihn zu nutzen, muss der Cursor auf dem Verstoß platziert und Strg+. (Punkt) gedrückt werden. Wählen Sie CountAsync() oder LongCountAsync() nicht verwenden, wenn AnyAsync() aus der Liste der Optionen verwendet werden kann, die angezeigt wird.

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

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, einen Verstoß gegen diese Regel zu unterdrücken, wenn Sie sich keine Gedanken über die Auswirkungen auf die Leistung der unnötigen Auflistungsenumeration machen, um die Anzahl zu berechnen.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch