CA1864: prefira o método 'IDictionary.TryAdd (TKey, TValue)'
Property | Valor |
---|---|
ID da regra | CA1864 |
Título | Prefira o método 'IDictionary.TryAdd(TKey, TValue) |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Como sugestão |
Causa
Dictionary<TKey,TValue>.Add é protegido por uma chamada Dictionary<TKey,TValue>.ContainsKey(TKey).
Descrição da regra
Tanto Dictionary<TKey,TValue>.ContainsKey(TKey) quanto Dictionary<TKey,TValue>.Add executam uma pesquisa, o que é redundante. Dictionary<TKey,TValue>.Add também lança uma exceção se a chave já estiver presente no dicionário. É mais eficiente chamar Dictionary<TKey,TValue>.TryAdd, que retorna um valor booliano que indica se o valor foi adicionado ou não. TryAdd
não sobrescreve o valor da chave se a chave já estiver presente.
Como corrigir violações
Substitua uma chamada para Dictionary<TKey,TValue>.ContainsKey(TKey) que é seguida por uma chamada para Dictionary<TKey,TValue>.Add com uma única chamada para Dictionary<TKey,TValue>.TryAdd.
Exemplo
O trecho de código a seguir mostra uma violação da CA1864:
void Run(IDictionary<int, string> dictionary)
{
if(!dictionary.ContainsKey(2)) {
dictionary.Add(2, "Hello World");
}
}
Sub Run(dictionary As IDictionary(Of Integer, String))
If Not dictionary.ContainsKey(2) Then
dictionary.Add(2, "Hello World")
End If
End Sub
O seguinte snippet de código conserta a violação:
void Run(IDictionary<int, string> dictionary)
{
dictionary.TryAdd(2, "Hello World");
}
Sub Run(dictionary As IDictionary(Of Integer, String))
dictionary.TryAdd(2, "Hello World")
End Sub
Quando suprimir avisos
É seguro suprimir este aviso se o desempenho não for uma preocupação e se você lidar com a exceção que pode ser lançada por Dictionary<TKey,TValue>.Add.
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 CA1864
// The code that's violating the rule is on this line.
#pragma warning restore CA1864
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.CA1864.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.