CA1836: предпочитать IsEmpty over Count при наличии

Свойство Значение
Идентификатор правила CA1836
Заголовок предпочитайте IsEmpty вместо Count (при наличии)
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Для определения наличия каких-либо элементов в объекте путем сравнения значения с 0 или 1 использовалось свойство Count или Length либо метод расширения Count<TSource>(IEnumerable<TSource>), хотя объект имеет более эффективное свойство IsEmpty, которое можно использовать вместо них.

Описание правила

Это правило помечает вызовы свойств Count и Length или методов LINQ Count<TSource>(IEnumerable<TSource>) и LongCount<TSource>(IEnumerable<TSource>), когда они используются для определения наличия каких-либо элементов в объекте, хотя объект имеет более эффективное свойство 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+ (период). В списке выберите Старайтесь использовать "IsEmpty" вместо "Count", чтобы определить, пуст ли объект.

Code fix for CA1836 - Prefer 'IsEmpty' over 'Count' to determine whether the object contains or not any items

Когда лучше отключить предупреждения

Вывод предупреждений для этого правила можно отключить, если вас не беспокоит влияние ненужного перечисления элементов для подсчета количества.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также