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
Property | 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 |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
O código compara duas cadeias de caracteres de maneira que não diferencia maiúsculas de minúsculas chamando ToLower()pela primeira vez , ToLowerInvariant(), ToUpper()ou ToUpperInvariant() em uma ou ambas as cadeias de caracteres.
Descrição da regra
Quando chamadas ToLower()de código , 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 sem diferenciação de maiúsculas e 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 *IgnoreCase
valores.
Como corrigir violações
Remova a chamada para ToLower(), ToLowerInvariant(), ToUpper(), ou ToUpperInvariant(), e chame um dos StringComparer métodos ou um dos seguintes métodos que usa um StringComparison argumento:
- 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 você alterar seu código para usar uma sobrecarga que usa um StringComparison argumento, 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 cordas não precisam ser comparadas de uma maneira culturalmente sensível, considere passar StringComparison.OrdinalIgnoreCase.
Exemplo
O exemplo a seguir mostra uma violação 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 para cenários em que está consultando um banco de dados comparando uma cadeia de caracteres. O EF Core lança uma exceção se você usar um método como String.Equals(String, StringComparison) o que usa um StringComparison argumento, pois ele não traduzirá essas consultas para SQL. Para obter mais informações, consulte Tradução de operações de cadeia de caracteres .NET internas.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.