通过


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

属性
规则 ID CA1836
标题 可用时最好使用 IsEmpty (而不是 Count)
类别 “性能”
修复会引起中断还是不会引起中断 非中断
在 .NET 10 中默认启用 作为一种建议
适用的语言 C# 和 Visual Basic

原因

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

规则说明

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

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

如何解决违规

若要解决违规行为,当 Count<TSource>(IEnumerable<TSource>)LongCount<TSource>(IEnumerable<TSource>) 方法调用或 LengthCount 属性访问用于判断对象是否为空时,请用 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+.(句点)"。 从显示的选项列表中选择“优先使用‘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

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

另请参阅