CA1836:可用时最好使用 IsEmpty (而不是 Count)
属性 | 值 |
---|---|
规则 ID | CA1836 |
标题 | 可用时最好使用 IsEmpty (而不是 Count) |
类别 | “性能” |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 作为建议 |
原因
使用了 Count
或 Length
属性或 Count<TSource>(IEnumerable<TSource>) 扩展方法,通过将值与 0
或 1
进行比较来确定对象是否包含任何项,以及对象是否具有更有效的 IsEmpty
属性可以代替使用。
规则说明
当将 Count
和 Length
属性或 Count<TSource>(IEnumerable<TSource>) 和 LongCount<TSource>(IEnumerable<TSource>) LINQ 方法用于确定对象是否包含任何项以及对象是否具有更有效的 IsEmpty
属性时,此规则将标记对它们的调用。
此规则的分析最初与类似规则 CA1827、CA1828 和 CA1829 重叠,这些规则的分析器与 CA1836 的分析器合并在一起,以在发生重叠时报告最佳诊断。
如何解决冲突
若要解决冲突,在使用 IsEmpty
属性访问来确定对象是否为空的操作中,当使用 Count<TSource>(IEnumerable<TSource>) 或 LongCount<TSource>(IEnumerable<TSource>) 方法调用或 Length
或 Count
属性访问时,请将其替换。 例如,以下两个代码片段显示了规则冲突及其解决方法:
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’”来确定对象是否包含任何项。
何时禁止显示警告
如果不关心不必要的项枚举是否会对计数计算的性能产生影响,可禁止显示此规则的冲突警告。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#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
有关详细信息,请参阅如何禁止显示代码分析警告。
相关规则
- CA1827:如果可以使用 Any,请勿使用 Count/LongCount
- CA1828:如果可以使用 AnyAsync,请勿使用 CountAsync/LongCountAsync
- CA1829:使用 Length/Count 属性,而不是 Enumerable.Count 方法