CA1508:使用されない条件付きコードを回避する

プロパティ
ルール ID CA1508
Title 使用されない条件付きコードを回避する
[カテゴリ] 保守容易性
修正が中断ありか中断なしか 中断なし
.NET 8 では既定で有効 いいえ

原因

実行時に常に true または false と評価される条件付きコードがメソッドにあります。 このため、条件の false 分岐で実行されないコードになります。

既定で、このルールではコードベース全体を分析しますが、これは構成可能です。

規則の説明

メソッドには、if ステートメント、バイナリ式 (==!=<>)、null チェックなどの条件付きコードを含めることができます。たとえば、次のコードについて考慮してください。

public void M(int i, int j)
{
    if (i != 0)
    {
        return;
    }

    if (j != 0)
    {
        return;
    }

    // Below condition will always evaluate to 'false' as 'i' and 'j' are both '0' here.
    if (i != j)
    {
        // Code in this 'if' branch is dead code.
        // It can either be removed or refactored.
        ...
    }
}

C# および VB コンパイラは、常に true または false として評価されるコンパイル時の "定数値" を含む条件チェックの分析を実行します。 このアナライザーは、非定数変数のデータ フロー分析を実行し、"非定数値" を含む冗長な条件チェックを判別します。 前のコードでは、アナライザーによって、ij が、i != j チェックが実施されるすべてのコード パスで両方とも 0 であることが判明します。 このため、このチェックは実行時に、常に false と評価されます。 if ステートメント内のコードは実行されないコードであり、削除またはリファクタリングすることができます。 同様に、アナライザーは変数の null 性を追跡し、冗長な null チェックを報告します。

注意

このアナライザーは、非定数値の負荷の高いデータフロー分析を実行します。 これにより、特定のコード ベースにおける全体のコンパイル時間が長くなる可能性があります。

どのようなときに警告を抑制するか

コードの保守性が懸念されない場合は、この規則違反を抑制しても問題ありません。 また、擬陽性であると識別された違反を抑制することもできます。 これらは、複数のスレッドから実行できる同時実行コードが存在する場合に発生する可能性があります。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1508
// The code that's violating the rule is on this line.
#pragma warning restore CA1508

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1508.severity = none

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

分析するコードを構成する

次のオプションを使用して、コードベースのどの部分に対してこのルールを実行するかを構成します。

これらのオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (保守容易性) のすべての規則です。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定のシンボルを除外する

型やメソッドなど、特定のシンボルを分析から除外することができます。 たとえば、MyType という名前の型のコードで規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

オプションの値で使用できるシンボル名の形式 (| で区切ります):

  • シンボル名のみ (包含する型または名前空間に関係なく、その名前が指定されたすべてのシンボルが含まれます)。
  • そのシンボルのドキュメント ID 形式の完全修飾名。 各シンボル名には、メソッドには M:、型には T:、名前空間には N: のように、シンボルの種類のプレフィックスが必要です。
  • コンストラクターには .ctor、静的コンストラクターには .cctor

例 :

オプション値 まとめ
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType MyType という名前のすべてのシンボルを検索します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 MyType1 または MyType2 という名前のすべてのシンボルを検索します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 指定された完全修飾シグネチャを持つ特定のメソッド MyMethod を検索します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) それぞれの完全修飾シグネチャを持つ特定のメソッド MyMethod1 または MyMethod2 を検索します。

特定の型とその派生型を除外する

分析から特定の型とその派生型を除外できます。 たとえば、MyType という名前の型のメソッドとその派生型で規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

オプションの値で使用できるシンボル名の形式 (| で区切ります):

  • 型の名前のみ (包含する型または名前空間に関係なく、その名前が指定されたすべての型が含まれます)。
  • そのシンボルのドキュメント ID 形式の完全修飾名 (オプションで T: プレフィックスも使用可)。

例 :

オプション値 まとめ
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType MyType という名前のすべての型と、そのすべての派生型を検索します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 MyType1 または MyType2 という名前のすべての型と、そのすべての派生型を検索します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 指定された完全修飾名を持つ特定の型 MyType と、そのすべての派生型を検索します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 それぞれの完全修飾名を持つ特定の型 MyType1 または MyType2 と、そのすべての派生型を検索します。

関連項目