CA1870: Uso de una instancia de "SearchValues" almacenada en caché

Propiedad Value
Identificador de la regla CA1870
Título Uso de una instancia de "SearchValues" almacenada en caché
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

Se llama a un método IndexOfAny o ContainsAny con muchos valores constantes de una manera que pueda beneficiarse de usar SearchValues en su lugar.

La regla no marca las llamadas que usan hasta cinco valores, ya que estas ya usan una implementación óptima.

Descripción de la regla

El uso de una instancia de caché SearchValues<T> es más eficaz que pasar valores a IndexOfAny o ContainsAny directamente.

Cómo corregir infracciones

Cree y almacene en caché una instancia de SearchValues<T> en un campo de static readonly y, a continuación, pase esa instancia a la llamada IndexOfAny o ContainsAny en su lugar.

Hay disponible un solucionador de código que realiza esta transformación.

Ejemplo

En el siguiente fragmento de código se muestran dos infracciones de la regla CA1870:

static readonly char[] MyValues = new[] { 'a', 'b', 'c', 'x', 'y', 'z' };

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(MyValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept("abcxyz");
}

El siguiente fragmento de código corrige las infracciones:

private static readonly SearchValues<char> s_myValues = SearchValues.Create("abcxyz");

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(s_myValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept(s_myValues);
}

Si hay varias llamadas a IndexOfAny con el mismo conjunto de valores, se debe reutilizar s_myValues.

Cuándo suprimir las advertencias

Es seguro suprimir esta advertencia si el rendimiento no es un problema.

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

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.CA1870.severity = none

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