Teilen über


CA1844: Arbeitsspeicherbasierte asynchrone Methoden beim Erstellen von Unterklassen von „Stream“ außer Kraft setzen

Eigenschaft Wert
Regel-ID CA1844
Titel Arbeitsspeicherbasierte asynchrone Methoden beim Erstellen von Unterklassen von „Stream“ außer Kraft setzen
Kategorie Leistung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Ein von Stream abgeleiteter Typ überschreibt ReadAsync(Byte[], Int32, Int32, CancellationToken), aber nicht ReadAsync(Memory<Byte>, CancellationToken). Oder ein von Stream abgeleiteter Typ überschreibt WriteAsync(Byte[], Int32, Int32, CancellationToken), aber nicht WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).

Regelbeschreibung

Die speicherbasierten Methoden ReadAsync und WriteAsync wurden hinzugefügt, um die Leistung zu verbessern. Dies wird von ihnen auf verschiedene Weise erreicht:

  • Sie geben ValueTask bzw. ValueTask<int> anstelle von Task bzw. Task<int> zurück.
  • Sie ermöglichen das Übergeben beliebiger Puffertypen, ohne dass eine zusätzliche Kopie in ein Array erfolgen muss.

Um diese Leistungsvorteile zu nutzen, müssen von Stream abgeleitete Typen eine eigene speicherbasierte Implementierung bereitstellen. Andernfalls wird die Standardimplementierung gezwungen, den Arbeitsspeicher in ein Array zu kopieren, um die arraybasierte Implementierung aufzurufen, was zu einer verringerten Leistung führt. Wenn der Aufrufer eine Memory<T>- oder ReadOnlyMemory<T>-Instanz übergibt, die nicht von einem Array unterstützt wird, wird die Leistung stärker beeinträchtigt.

Behandeln von Verstößen

Die einfachste Möglichkeit zum Beheben von Verstößen besteht darin, die arraybasierte Implementierung in eine speicherbasierte Implementierung umzuschreiben und die arraybasierten Methoden anschließend in Bezug auf die speicherbasierten Methoden zu implementieren.

Wann sollten Warnungen unterdrückt werden?

In den folgenden Situationen ist es sicher, eine Warnung aus dieser Regel zu unterdrücken:

  • Leistungseinbußen sind kein Problem.
  • Sie wissen, dass Ihre Stream-Unterklasse grundsätzlich nur die arraybasierten Methoden verwendet.
  • Ihre Stream-Unterklasse verfügt über Abhängigkeiten, die keine speicherbasierten Puffer unterstützen.

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 CA1844
// The code that's violating the rule is on this line.
#pragma warning restore CA1844

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.CA1844.severity = none

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

Siehe auch