CA1878: Preferir propiedades ReadOnlySpan sobre campos de matriz de solo lectura

Propiedad Value
Identificador de la regla CA1878
Title Preferir propiedades ReadOnlySpan sobre campos de matriz de solo lectura
Categoría Rendimiento
La corrección es disruptiva o no disruptiva Non-breaking
Habilitado de forma predeterminada en .NET 11 Como sugerencia
Idiomas aplicables C#

Causa

Un campo de matriz unidimensional estática privada contiene valores constantes admitidos y todos los usos observados se pueden volver a escribir de forma segura para usar una ReadOnlySpan<T> propiedad .

Descripción de la regla

Un campo de matriz estática de solo lectura requiere una asignación de matriz administrada. Cuando una ReadOnlySpan<T> propiedad devuelve datos constantes admitidos, el compilador de C# puede reducir los datos sin asignar una matriz administrada. Reemplazar el campo por una propiedad puede reducir las asignaciones al tiempo que se conserva el acceso de solo lectura a los datos.

El analizador admite los siguientes tipos de elementos:

  • bool, bytey sbyte se admiten siempre que ReadOnlySpan<T> esté disponible.
  • shortSolo se admiten , ushort, longuintintfloat, ulongy double cuando la compilación de destino expone el método estático RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) público. char .NET 7 y los ensamblados de referencia posteriores exponen este método.

El analizador no diagnostica matrices de tipos de decimalenumeración , nint, nuint, estructuras arbitrarias o tipos de referencia. Tampoco diagnostica matrices escalonadas ni matrices multidimensionales.

Cómo corregir infracciones

Reemplace el campo de matriz por una propiedad con forma de expresión que devuelve ReadOnlySpan<T>.

La corrección de código vuelve a escribir los usos aptos del campo. En el caso de las llamadas admitidas AsSpan , quita una llamada redundante o reemplaza la llamada por una operación de intervalo equivalente, como Slice. La corrección de código no se ofrece cuando no puede conservar la semántica de cada uso.

Example

El fragmento de código siguiente muestra una infracción de CA1878:

class CA1878ViolationExample
{
    private static readonly byte[] Prefix = new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

El siguiente fragmento de código corrige la infracción:

class CA1878FixExample
{
    private static ReadOnlySpan<byte> Prefix => new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

Cuándo suprimir las advertencias

Suprima una advertencia si conserva intencionadamente la identidad o la mutabilidad de la matriz, o si la conservación de la compatibilidad de la API requiere que el miembro siga siendo un campo de matriz. La regla solo notifica campos de solo lectura estáticos privados cuyos usos observados se pueden volver a escribir de forma segura.

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 CA1878
// The code that's violating the rule is on this line.
#pragma warning restore CA1878

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

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

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

Véase también