CA1862: Usare gli overload del metodo 'StringComparison' per eseguire confronti di stringhe senza distinzione tra maiuscole e minuscole
Proprietà | valore |
---|---|
ID regola | CA1862 |
Title | Usare gli overload del metodo 'StringComparison' per eseguire confronti di stringhe senza distinzione tra maiuscole e minuscole |
Categoria | Prestazioni |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | Come suggerimento |
Causa
Il codice confronta due stringhe in modo senza distinzione tra maiuscole e minuscole chiamando ToLower()prima , ToLowerInvariant(), ToUpper()o ToUpperInvariant() su una o entrambe le stringhe.
Descrizione regola
Quando il codice chiama ToLower(), ToUpper()ToLowerInvariant(), o ToUpperInvariant(), viene eseguita un'allocazione. Se l'unico motivo per chiamare questi metodi consiste nell'eseguire un confronto di stringhe o una ricerca senza distinzione tra maiuscole e minuscole, l'allocazione non è necessaria. È invece possibile chiamare un metodo di confronto di stringhe che accetta e StringComparison specifica uno dei *IgnoreCase
valori.
Come correggere le violazioni
Rimuovere la chiamata a ToLower(), ToLowerInvariant()ToUpper(), o ToUpperInvariant()e chiamare uno dei StringComparer metodi oppure uno dei metodi seguenti che accetta un StringComparison argomento:
- 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)
Nota
- Se si modifica il codice in modo da usare un overload che accetta un StringComparison argomento, potrebbe causare modifiche minime nel comportamento. È importante eseguire test approfonditi se si apporta questa modifica o si accetta il suggerimento della lampadina di Visual Studio.
- Se le stringhe non devono essere confrontate in modo sensibile alla cultura, valutare la possibilità di StringComparison.OrdinalIgnoreCasepassare .
Esempio
L'esempio seguente mostra una violazione della regola:
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'esempio seguente mostra il codice che corregge la violazione:
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)
Quando eliminare gli avvisi
Se le prestazioni non sono un problema, è possibile eliminare gli avvisi da questa regola.
Se si usa Entity Framework Core (EF Core), è consigliabile eliminare questa regola per gli scenari in cui si esegue una query su un database confrontando una stringa. EF Core genera un'eccezione se si usa un metodo, String.Equals(String, StringComparison) ad esempio che accetta un StringComparison argomento, perché tali query non verranno convertite in SQL. Per altre informazioni, vedere Traduzione di operazioni di stringa .NET predefinite.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.