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
yValueTask<int>
en lugar deTask
yTask<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.