CA1854:首选 IDictionary.TryGetValue(TKey, out TValue) 方法

属性
规则 ID CA1854
标题 首选 IDictionary.TryGetValue(TKey, out TValue) 方法
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

IDictionary.ContainsKey 检查保护的 IDictionary 元素访问。

规则说明

访问 IDictionary 的元素时,索引器实现会通过调用 IDictionary.ContainsKey 方法来检查 null 值。 如果还调用 if 子句中的 IDictionary.ContainsKey 来保护值查找,则会在只需要一个查找时执行两个查找。

如何解决冲突

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.ContainsKey 检查时使用 IDictionary 的自定义实现来避免值查找,则可禁止显示此警告。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#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

有关详细信息,请参阅如何禁止显示代码分析警告