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:

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.