| 属性 | 值 |
|---|---|
| 规则 ID | CA1836 |
| 标题 | 可用时最好使用 IsEmpty (而不是 Count) |
| 类别 | “性能” |
| 修复会引起中断还是不会引起中断 | 非中断 |
| 在 .NET 10 中默认启用 | 作为一种建议 |
| 适用的语言 | C# 和 Visual Basic |
原因
使用了 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 的分析器合并在一起,以在发生重叠时报告最佳诊断。
如何解决违规
若要解决违规行为,当 Count<TSource>(IEnumerable<TSource>) 或 LongCount<TSource>(IEnumerable<TSource>) 方法调用或 Length 或 Count 属性访问用于判断对象是否为空时,请用 IsEmpty 属性访问替换它们。 例如,以下两个代码片段显示了规则冲突及其解决方法:
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
何时禁止显示警告
如果不关心不必要的项枚举对计数计算的性能影响,可以忽略此规则的违规。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#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 方法