Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA1862 |
| Title | Utilizzare le sovraccariche del metodo 'StringComparison' per eseguire confronti tra stringhe senza distinzione tra maiuscole e minuscole. |
| Categoria | Prestazioni |
| La correzione causa un'interruzione o meno | Non rompente |
| Abilitato per impostazione predefinita in .NET 10 | Come suggerimento |
| Linguaggi applicabili | C# e Visual Basic |
Causa
Il codice confronta due stringhe in modo insensibile alle maiuscole chiamando prima ToLower(), ToLowerInvariant(), ToUpper() o ToUpperInvariant() su una o entrambe le stringhe.
Descrizione regola
Quando il codice chiama ToLower(), ToLowerInvariant()ToUpper(), 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 un StringComparison e specifica uno dei valori di *IgnoreCase.
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 passare StringComparison.OrdinalIgnoreCase.
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 utilizza un metodo come, ad esempio, String.Equals(String, StringComparison), che accetta un argomento StringComparison, poiché tali query non verranno tradotte in SQL. Per ulteriori informazioni, vedere Traduzione delle operazioni sulle stringhe .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.