CA1844: Proporcionar invalidaciones basadas en memoria de métodos asincrónicos al usar subclases "Stream"

Propiedad Value
Identificador de la regla CA1844
Título Proporcionar invalidaciones basadas en memoria de métodos asincrónicos al crear subclases de 'Stream'
Categoría Rendimiento
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un tipo derivado de Stream invalida ReadAsync(Byte[], Int32, Int32, CancellationToken), pero no ReadAsync(Memory<Byte>, CancellationToken). O bien, un tipo derivado de Stream invalida a WriteAsync(Byte[], Int32, Int32, CancellationToken), pero no a WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).

Descripción de la regla

Los métodos ReadAsync y WriteAsync basados en memoria se agregaron para mejorar el rendimiento, lo que logran de varias maneras:

  • Devuelven ValueTask y ValueTask<int> en lugar de Task y Task<int>, respectivamente.
  • Permiten pasar cualquier tipo de búfer sin tener que realizar una copia adicional en una matriz.

Para lograr estas ventajas de rendimiento, los tipos que derivan de Stream deben proporcionar su propia implementación basada en memoria. De lo contrario, la implementación predeterminada se verá obligada a copiar la memoria en una matriz para llamar a la implementación basada en matriz, lo que reduce el rendimiento. Cuando el autor de la llamada pasa una instancia de Memory<T> o ReadOnlyMemory<T> que no está copiada en una matriz, el rendimiento se ve más afectado.

Cómo corregir infracciones

La manera más fácil de corregir infracciones es volver a escribir la implementación basada en matriz como una implementación basada en memoria y luego implementar los métodos basados en matrices conforme a los métodos basados en memoria.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si se aplica alguna de las siguientes situaciones:

  • El impacto sobre el rendimiento no es un problema.
  • Se sabe que la subclase Stream solo va a usar los métodos basados en matriz.
  • La subclase Stream tiene dependencias que no admiten búferes basados en memoria.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

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

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Vea también