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.