CA1844: Fornecer substituições baseadas em memória de 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 subclassificar 'Stream' |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
Um tipo derivado de Stream substituições, ReadAsync(Byte[], Int32, Int32, CancellationToken) mas não substitui ReadAsync(Memory<Byte>, CancellationToken). Ou, um tipo derivado de Stream substituições WriteAsync(Byte[], Int32, Int32, CancellationToken) , mas não substitui WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).
Descrição da regra
Os métodos e WriteAsync
baseados em ReadAsync
memória foram adicionados para melhorar o desempenho, o que eles realizam 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 ter que executar uma cópia extra para uma matriz.
Para obter esses benefícios de desempenho, os tipos derivados devem Stream fornecer sua própria implementação baseada em memória. Caso contrário, a implementação padrão será forçada a copiar a memória em uma matriz para chamar a implementação baseada em matriz, resultando em desempenho reduzido. Quando o chamador passa em uma Memory<T> instância 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 sua implementação baseada em matriz como uma implementação baseada em memória e, em seguida, implementar os métodos baseados em matriz em termos de métodos baseados em memória.
Quando suprimir avisos
É seguro suprimir um aviso desta regra se alguma das seguintes situações se aplicar:
- O impacto no desempenho não é uma preocupação.
- Você sabe que sua
Stream
subclasse usará apenas os métodos baseados em matriz. - Sua
Stream
subclasse tem dependências que não suportam buffers baseados em memória.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1844.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.