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' を優先します] を選択します。
どのようなときに警告を抑制するか
数を計算するための不要な項目の列挙によるパフォーマンスへの影響が懸念されない場合は、この規則の違反を抑制できます。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#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:Enumerable. Count メソッドではなく Length/Count プロパティを使用します
関連項目
.NET