CA1836:使用可能な場合は、Count よりも IsEmpty を優先します

プロパティ
ルール ID CA1836
Title 使用可能な場合は、Count よりも IsEmpty を優先します
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

Count または Length プロパティあるいは Count<TSource>(IEnumerable<TSource>) 拡張メソッドが、値を 0 または 1 と比較してオブジェクトに項目が含まれているかどうかを判断するために使用されました。オブジェクトには、代わりに使用できる、より効率的な IsEmpty プロパティがあります。

規則の説明

この規則は、Count および Length プロパティまたは Count<TSource>(IEnumerable<TSource>) および LongCount<TSource>(IEnumerable<TSource>) LING メソッドの呼び出しが、オブジェクトに項目が含まれているかどうかを判断するために使用されている場合にフラグを付けます。オブジェクトには、より効率的な IsEmpty プロパティがあります。

この規則の分析は、類似した規則 CA1827、CA1828、および CA1829 と最初は重複していました。このような規則のアナライザーは、重複が発生した場合に最適な診断を報告するために CA1836 用の規則とマージされました。

違反の修正方法

違反を修正するには、オブジェクトが空かどうかを判断する操作で使用されている場合の Count<TSource>(IEnumerable<TSource>) または LongCount<TSource>(IEnumerable<TSource>) メソッド呼び出し、あるいは Length または Count プロパティ アクセスを、IsEmpty プロパティ アクセスの使用に置き換えます。 たとえば、次の 2 つのコード スニペットは、規則違反とその修正方法を示しています。

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+. (ピリオド) を押します。 表示されるオプションの一覧から、 [オブジェクトに項目が含まれているかどうかを判断するには、'Count' より 'IsEmpty' を優先します] を選択します。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

関連項目