CA1854: предпочитать IDictionary.TryGetValue(TKey, out TValue) метод

Свойство Значение
Идентификатор правила CA1854
Заголовок IDictionary.TryGetValue(TKey, out TValue) Предпочитать метод
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Доступ IDictionary к элементу, защищенный IDictionary.ContainsKey проверка.

Описание правила

При доступе к элементу IDictionary реализации индексатора проверка значение NULL путем вызова IDictionary.ContainsKey метода. Если вы также вызываете IDictionary.ContainsKey предложение для защиты подстановки значений if , два подстановки выполняются только при необходимости.

Устранение нарушений

Замените IDictionary.ContainsKey вызов и доступ к элементу вызовом IDictionary.TryGetValue метода.

Нарушение:

public string? GetValue(string key)
{
    if (_dictionary.ContainsKey(key))
    {
        return _dictionary[key];
    }

    return null;
}
Public Function GetValue(key As String) As String
    If _dictionary.ContainsKey(key) Then
        Return _dictionary(key)
    End If

    Return Nothing
End Function

Исправление:

public string? GetValue(string key)
{
    if (_dictionary.TryGetValue(key, out string? value))
    {
        return value;
    }

    return null;
}
Public Function GetValue(key As String) As String
    Dim value as String

    If _dictionary.TryGetValue(key, value) Then
        Return value
    End If

    Return Nothing
End Function

Когда лучше отключить предупреждения

Это предупреждение можно отключить, если вы используете пользовательскую реализациюIDictionary, которая позволяет избежать подстановки значений IDictionary.ContainsKey при выполнении проверка.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.