CA1836: предпочитать IsEmpty over Count при наличии
Свойство | Значение |
---|---|
Идентификатор правила | CA1836 |
Заголовок | предпочитайте IsEmpty вместо Count (при наличии) |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предложение |
Причина
Для определения наличия каких-либо элементов в объекте путем сравнения значения с 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", чтобы определить, пуст ли объект.
Когда лучше отключить предупреждения
Вывод предупреждений для этого правила можно отключить, если вас не беспокоит влияние ненужного перечисления элементов для подсчета количества.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#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: не используйте Count/LongCount, если можно использовать Любой.
- CA1828: не используйте CountAsync/LongCountAsync при использовании AnyAsync
- CA1829: используйте свойство Length/Count вместо метода Enumerable.Count