Share via


CA1844: Ange minnesbaserade åsidosättningar av asynkrona metoder vid underklassning av "Stream"

Property Värde
Regel-ID CA1844
Title Ange minnesbaserade åsidosättningar av asynkrona metoder vid underklassificering av "Stream"
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En typ som härleds från Stream åsidosättningar men åsidosätter ReadAsync(Byte[], Int32, Int32, CancellationToken)ReadAsync(Memory<Byte>, CancellationToken)inte . Eller en typ som härleds från Stream åsidosättningar men inte åsidosätter WriteAsync(Byte[], Int32, Int32, CancellationToken)WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).

Regelbeskrivning

De minnesbaserade ReadAsync metoderna och WriteAsync metoderna har lagts till för att förbättra prestandan, vilket de åstadkommer på flera sätt:

  • De återvänder ValueTask och ValueTask<int> i stället Task för och Task<int>, respektive.
  • De gör att alla typer av buffertar kan skickas in utan att behöva utföra en extra kopia till en matris.

För att uppnå dessa prestandafördelar måste typer som härleds från Stream tillhandahålla en egen minnesbaserad implementering. Annars tvingas standardimplementeringen att kopiera minnet till en matris för att anropa den matrisbaserade implementeringen, vilket resulterar i lägre prestanda. När anroparen skickar en eller ReadOnlyMemory<T> en Memory<T> instans som inte backas upp av en matris påverkas prestandan mer.

Så här åtgärdar du överträdelser

Det enklaste sättet att åtgärda överträdelser är att skriva om din matrisbaserade implementering som en minnesbaserad implementering och sedan implementera de matrisbaserade metoderna när det gäller minnesbaserade metoder.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om någon av följande situationer gäller:

  • Prestandaträffen är inte ett problem.
  • Du vet att underklassen Stream bara kommer att använda matrisbaserade metoder.
  • Underklassen Stream har beroenden som inte stöder minnesbaserade buffertar.

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

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även