CA1844: fornecer substituições baseadas em memória dos métodos assíncronos ao subclassificar 'Stream'
Property | Valor |
---|---|
ID da regra | CA1844 |
Título | Fornecer substituições baseadas em memória de métodos assíncronos ao subclasse "Stream" |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Como sugestão |
Causa
Um tipo derivado de Stream substitui ReadAsync(Byte[], Int32, Int32, CancellationToken), mas não substitui ReadAsync(Memory<Byte>, CancellationToken). Ou, um tipo derivado de Stream substitui WriteAsync(Byte[], Int32, Int32, CancellationToken), mas não substitui WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).
Descrição da regra
Os métodos ReadAsync
e WriteAsync
baseados em memória foram adicionados para melhorar o desempenho, o que eles fazem de várias maneiras:
- Eles retornam
ValueTask
eValueTask<int>
, em vez deTask
eTask<int>
, respectivamente. - Eles permitem que qualquer tipo de buffer seja passado sem precisar executar uma cópia extra para uma matriz.
Para obter esses benefícios de desempenho, os tipos que derivam de Stream devem fornecer uma implementação própria baseada em memória. Caso contrário, a implementação padrão será forçada a copiar a memória para uma matriz para chamar a implementação baseada em matriz, resultando em desempenho reduzido. Quando o chamador passa uma instância Memory<T> ou ReadOnlyMemory<T> que não é apoiada por uma matriz, o desempenho é mais afetado.
Como corrigir violações
A maneira mais fácil de corrigir violações é reescrever a implementação baseada em matriz como uma implementação baseada em memória e implementar os métodos baseados em matriz em termos dos métodos baseados em memória.
Quando suprimir avisos
Será seguro suprimir um aviso dessa regra se qualquer uma das seguintes situações se aplicar:
- O impacto no desempenho não é uma preocupação.
- Você sabe que sua subclasse
Stream
usará apenas os métodos baseados em matriz. - Sua subclasse
Stream
tem dependências que não dão suporte a buffers baseados em memória.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA1844
// The code that's violating the rule is on this line.
#pragma warning restore CA1844
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1844.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.