Condividi tramite


CA1844: fornire sostituzioni basate sulla memoria dei metodi asincroni quando si sottoclassa 'Stream'

Proprietà valore
ID regola CA1844
Title Fornire sostituzioni basate sulla memoria dei metodi asincroni durante la sottoclasse 'Stream'
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Un tipo derivato dalle Stream sostituzioni ReadAsync(Byte[], Int32, Int32, CancellationToken) ma non esegue l'override di ReadAsync(Memory<Byte>, CancellationToken). In alternativa, un tipo derivato da Stream sostituzioni WriteAsync(Byte[], Int32, Int32, CancellationToken) ma non esegue l'override WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)di .

Descrizione regola

I metodi e WriteAsync basati sulla ReadAsync memoria sono stati aggiunti per migliorare le prestazioni, che vengono eseguite in diversi modi:

  • Restituiscono ValueTask e ValueTask<int> , Task rispettivamente, e Task<int>.
  • Consentono di passare qualsiasi tipo di buffer senza dover eseguire una copia aggiuntiva in una matrice.

Per realizzare questi vantaggi in termini di prestazioni, i tipi che derivano da Stream devono fornire la propria implementazione basata sulla memoria. In caso contrario, l'implementazione predefinita verrà forzata per copiare la memoria in una matrice per chiamare l'implementazione basata su matrice, con conseguente riduzione delle prestazioni. Quando il chiamante passa in un'istanza Memory<T> o ReadOnlyMemory<T> che non è supportata da una matrice, le prestazioni sono più interessate.

Come correggere le violazioni

Il modo più semplice per correggere le violazioni consiste nel riscrivere l'implementazione basata su matrice come implementazione basata sulla memoria e quindi implementare i metodi basati su matrice in termini di metodi basati sulla memoria.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se si applica una delle situazioni seguenti:

  • Il successo delle prestazioni non è un problema.
  • Si sa che la Stream sottoclasse userà solo i metodi basati su matrici.
  • La Stream sottoclasse presenta dipendenze che non supportano buffer basati sulla memoria.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche