CA1862 : Utilisez les surcharges de méthode « StringComparison » pour effectuer des comparaisons de chaînes qui ne respectent pas la casse
Propriété | Value |
---|---|
Identificateur de la règle | CA1862 |
Titre | Utilisez les surcharges de méthode « StringComparison » pour effectuer des comparaisons de chaînes qui ne respectent pas la casse |
Catégorie | Performances |
Le correctif est cassant ou non cassant | Sans rupture |
Activée par défaut dans .NET 9 | À titre de suggestion |
Cause
Le code compare deux chaînes de manière non sensible à la casse en appelant d’abord ToLower(), ToLowerInvariant(), ToUpper() ou ToUpperInvariant()sur une des chaînes ou les deux.
Description de la règle
Lorsque le code appelle ToLower(), ToLowerInvariant(), ToUpper(), ou ToUpperInvariant(), une allocation est effectuée. Si la seule raison d’appeler ces méthodes est d’effectuer une comparaison de chaînes ou une recherche sans respect de la casse, l’allocation n’est pas nécessaire. À la place, vous pouvez appeler une méthode de comparaison de chaînes qui prend un StringComparison et spécifie l’une des valeurs *IgnoreCase
.
Comment corriger les violations
Supprimez l’appel à ToLower(), ToLowerInvariant(), ToUpper() ou ToUpperInvariant() et appelez l’une des méthodes StringComparer, ou l’une des méthodes suivantes qui accepte un argument StringComparison :
- String.Compare(String, String, StringComparison)
- String.Contains(String, StringComparison)
- String.EndsWith(String, StringComparison)
- String.Equals(String, StringComparison)
- String.IndexOf
- String.LastIndexOf
- String.Replace(String, String, StringComparison)
- String.StartsWith(String, StringComparison)
- Compare(Uri, Uri, UriComponents, UriFormat, StringComparison)
- StringSegment.Compare(StringSegment, StringSegment, StringComparison)
- StringSegment.EndsWith(String, StringComparison)
- StringSegment.Equals
- StringSegment.StartsWith(String, StringComparison)
Remarque
- Si vous modifiez votre code pour utiliser une surcharge qui prend un argument StringComparison, cela peut entraîner des modifications subtiles du comportement. Il est important d’effectuer des tests approfondis si vous apportez cette modification ou acceptez la suggestion de l’ampoule Visual Studio.
- Si les chaînes n’ont pas besoin d’être comparées d’une manière culturellement sensible, envisagez de passer StringComparison.OrdinalIgnoreCase.
Exemple
L’exemple suivant montre une violation de la règle :
string s1 = "aBc";
string s2 = "aBC";
int _ = s1.ToUpper().CompareTo(s2.ToUpper());
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"
Dim i As Integer = s1.ToUpper().CompareTo(s2.ToUpper())
L’exemple suivant montre le code qui corrige la violation :
string s1 = "aBc";
string s2 = "aBC";
int _ = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2);
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"
Dim i As Integer = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2)
Quand supprimer les avertissements
Vous pouvez sans risque supprimer des avertissements de cette règle si les performances ne constituent pas un problème.
Si vous utilisez Entity Framework Core (EF Core), vous devez supprimer cette règle pour les scénarios où vous interrogez une base de données en comparant une chaîne. EF Core lève une exception si vous utilisez une méthode telle que String.Equals(String, StringComparison) qui prend un argument StringComparison, car elle ne traduit pas ces requêtes en SQL. Pour plus d’informations, consultez Traduction des opérations de chaîne .NET intégrées.
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 CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862
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.CA1862.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.