Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| Propriété | Value |
|---|---|
| Identificateur de la règle | CA1870 |
| Titre | Utiliser une instance « SearchValues » mise en cache |
| Catégorie | Performances |
| Le correctif est cassant ou non cassant | Sans rupture |
| Activé par défaut dans .NET 10 | À titre de suggestion |
Cause
Une méthode IndexOfAny ou ContainsAny est appelée avec de nombreuses valeurs constantes d’une manière qui peut tirer parti de l’utilisation de SearchValues à la place.
La règle ne signale pas les appels qui utilisent jusqu’à cinq valeurs, car ceux-ci utilisent déjà une implémentation optimale.
Description de la règle
L’utilisation d’une instance SearchValues<T> mise en cache est plus efficace que de passer des valeurs vers IndexOfAny ou ContainsAny directement.
Comment corriger les violations
Créez et cachez une instance SearchValues<T> dans un champ static readonly, puis transmettez cette instance à l’appel IndexOfAny ou ContainsAny à la place.
Un correcteur de code qui réalise cette transformation de façon automatique est disponible.
Exemple
L’extrait de code suivant montre deux violations de 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");
}
L’extrait de code suivant corrige les violations :
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);
}
S’il existe plusieurs appels à IndexOfAny avec le même ensemble de valeurs, vous devez réutiliser s_myValues.
Quand supprimer les avertissements
Vous pouvez supprimer cet avertissement sans risque, si les performances ne sont pas un problème.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1870
// The code that's violating the rule is on this line.
#pragma warning restore CA1870
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1870.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.