CA1836:可用时最好使用 IsEmpty (而不是 Count)

属性
规则 ID CA1836
标题 可用时最好使用 IsEmpty (而不是 Count)
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用 作为建议

原因

使用了 CountLength 属性或 Count<TSource>(IEnumerable<TSource>) 扩展方法,通过将值与 01 进行比较来确定对象是否包含任何项,以及对象是否具有更有效的 IsEmpty 属性可以代替使用。

规则说明

当将 CountLength 属性或 Count<TSource>(IEnumerable<TSource>)LongCount<TSource>(IEnumerable<TSource>) LINQ 方法用于确定对象是否包含任何项以及对象是否具有更有效的 IsEmpty 属性时,此规则将标记对它们的调用。

此规则的分析最初与类似规则 CA1827、CA1828 和 CA1829 重叠,这些规则的分析器与 CA1836 的分析器合并在一起,以在发生重叠时报告最佳诊断。

如何解决冲突

若要解决冲突,在使用 IsEmpty 属性访问来确定对象是否为空的操作中,当使用 Count<TSource>(IEnumerable<TSource>)LongCount<TSource>(IEnumerable<TSource>) 方法调用或 LengthCount 属性访问时,请将其替换。 例如,以下两个代码片段显示了规则冲突及其解决方法:

using System.Collections.Concurrent;

class C
{
    ConcurrentQueue<int> _queue;
    public bool IsEmpty => _queue.Count == 0;
}
using System.Collections.Concurrent;

class C
{
    ConcurrentQueue<int> _queue;
    public bool IsEmpty => _queue.IsEmpty;
}

提示

Visual Studio 中为此规则提供了代码修补程序。 若要使用它,请将光标置于冲突上,然后按“Ctrl+.”(句点)。 从显示的选项列表中选择“最好使用’IsEmpty’而不是‘Count’”来确定对象是否包含任何项。

CA1836 的代码修补程序 - 最好使用“IsEmpty”而不是“Count”来确定对象是否包含任何项

何时禁止显示警告

如果不关心不必要的项枚举是否会对计数计算的性能产生影响,可禁止显示此规则的冲突警告。

抑制警告

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

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

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

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

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

另请参阅