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 9 | 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
ochValueTask<int>
i ställetTask
för ochTask<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.