CA1841:首选字典包含方法

2022-02-26 08:36:31 浏览数 (1)

规则 ID

CA1841

类别

“性能”

修复是中断修复还是非中断修复

非中断

原因

此规则可找到在 IDictionary<TKey,TValue> 的 Keys 或 Values 集合上对 Contains 方法的调用,这些调用可替换为在字典本身对 ContainsKey 或 ContainsValue 方法的调用。

规则说明

对 Keys 或 Values 集合调用 Contains 通常比对字典本身调用 ContainsKey 或 ContainsValue 开销更高:

许多字典实现会延迟对键值集合的实例化,这意味着访问 Keys 或 Values 集合可能导致额外的分配。

如果键/值集合使用显式接口实现来隐藏 ICollection<T> 上的方法,可能最终会对 IEnumerable<T> 上调用扩展方法。 这可能会降低性能,尤其是在访问键集合时。 大多数字典实现都能为键提供快速的 O(1) 包含检查,而 IEnumerable<T> 上的 Contains 扩展方法通常执行较慢的 O(n) 包含检查。

如何解决冲突

若要解决冲突,请将对 dictionary.Keys.Contains 或 dictionary.Values.Contains 的调用分别替换为对 dictionary.ContainsKey 或 dictionary.ContainsValue 的调用。

下面的代码片段显示了冲突示例及其解决方法。

代码语言:javascript复制
using System.Collections.Generic;
// Importing this namespace brings extension methods for IEnumerable<T> into scope.
using System.Linq;
class Example
{
    void Method()
    {
        var dictionary = new Dictionary<string, int>();
        //  Violation
        dictionary.Keys.Contains("hello world");
        //  Fixed
        dictionary.ContainsKey("hello world");
        //  Violation
        dictionary.Values.Contains(17);
        //  Fixed
        dictionary.ContainsValue(17);
    }
}
Imports System.Collection.Generic
' Importing this namespace brings extension methods for IEnumerable(Of T) into scope.
' Note that in Visual Basic, this namespace is often imported automatically throughout the project.
Imports System.Linq
Class Example
    Private Sub Method()
        Dim dictionary = New Dictionary(Of String, Of Integer)
        ' Violation
        dictionary.Keys.Contains("hello world")
        ' Fixed
        dictionary.ContainsKey("hello world")
        ' Violation
        dictionary.Values.Contains(17)
        ' Fixed
        dictionary.ContainsValue(17)
    End Sub
End Class

何时禁止显示警告

如果有问题的代码不会对性能造成重大影响,可安全地禁止显示此规则发出的警告。

另请参阅

性能规则

0 人点赞