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
eValueTask<int>
,Task
rispettivamente, eTask<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.