CA1864: Se prefiere el método "IDictionary.TryAdd(TKey, TValue)"

Propiedad Value
Identificador de la regla CA1864
Título Preferir el método ''IDictionary.TryAdd(TKey, TValue)''
Categoría Rendimiento
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Dictionary<TKey,TValue>.Add está protegido por una llamada de Dictionary<TKey,TValue>.ContainsKey(TKey).

Descripción de la regla

Tanto Dictionary<TKey,TValue>.ContainsKey(TKey) como Dictionary<TKey,TValue>.Add realizan una búsqueda, que es redundante. Dictionary<TKey,TValue>.Add también produce una excepción si la clave ya está presente en el diccionario. Es más eficaz llamar a Dictionary<TKey,TValue>.TryAdd, que devuelve un valor booleano que indica si el valor se agregó o no. TryAdd no sobrescribe el valor de la clave si la clave ya está presente.

Cómo corregir infracciones

Reemplace una llamada a Dictionary<TKey,TValue>.ContainsKey(TKey) seguida de una llamada a Dictionary<TKey,TValue>.Add por una sola llamada a Dictionary<TKey,TValue>.TryAdd.

Ejemplo

El siguiente fragmento de código muestra una infracción de la regla 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

El siguiente fragmento de código corrige la infracción:

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

Cuándo suprimir las advertencias

Es seguro suprimir esta advertencia si el rendimiento no es un problema y si controla la excepción que podría producir Dictionary<TKey,TValue>.Add.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA1864
// The code that's violating the rule is on this line.
#pragma warning restore CA1864

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA1864.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.