CA1862: Use as sobrecargas do método "StringComparison" para executar comparações de cadeia de caracteres que não diferenciam maiúsculas de minúsculas
Propriedade | Valor |
---|---|
ID da regra | CA1862 |
Título | Use as sobrecargas do método "StringComparison" para executar comparações de cadeia de caracteres que não diferenciam maiúsculas de minúsculas |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Como sugestão |
Causa
O código compara duas cadeias de caracteres de maneira que não diferencia maiúsculas de minúsculas chamando ToLower(), ToLowerInvariant(), ToUpper() ou ToUpperInvariant() em uma ou ambas as cadeias de caracteres.
Descrição da regra
Quando o código chama ToLower(), ToLowerInvariant(), ToUpper() ou ToUpperInvariant(), uma alocação é executada. Se o único motivo para chamar esses métodos for executar uma comparação ou pesquisa de cadeia de caracteres que não diferencia maiúsculas de minúsculas, a alocação será desnecessária. Em vez disso, você pode chamar um método de comparação de cadeia de caracteres que usa um StringComparison e especifica um dos valores de *IgnoreCase
.
Como corrigir violações
Remova a chamada para ToLower(), ToLowerInvariant(), ToUpper() ou ToUpperInvariant() e chame um dos métodos StringComparer ou um dos seguintes métodos que usa um argumento 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)
Observação
- Se você alterar seu código para usar uma sobrecarga que usa um argumento StringComparison, isso pode causar alterações sutis no comportamento. É importante realizar testes completos se você fizer essa alteração ou aceitar a sugestão de lâmpada do Visual Studio.
- Se as cadeias de caracteres não precisarem ser comparadas de maneira culturalmente sensível, considere passar StringComparison.OrdinalIgnoreCase.
Exemplo
O exemplo a seguir mostra duas violações da regra:
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())
O exemplo a seguir mostra o código que corrige a violação:
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 suprimir avisos
É seguro suprimir avisos dessa regra se o desempenho não for uma preocupação.
Se você estiver usando o Entity Framework Core (EF Core), deverá suprimir essa regra nos cenários em que estiver consultando um banco de dados por meio da comparação de uma cadeia de caracteres. O EF Core gerará uma exceção se você usar um método como String.Equals(String, StringComparison) que usa um argumento StringComparison, pois ele não traduzirá essas consultas para SQL. Para obter mais informações, confira Tradução de operações de cadeia de caracteres .NET internas.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.