コード分析の違反を抑制する

コードの作成時にチームと共同作業を行う場合、警告が適用されていないことを示すと便利な場合があります。 コード分析違反を抑制すると、コードがレビューされたことがチーム メンバーに示され、警告を抑制することができます。 以下のセクションでは、Visual Studio IDE を使用してコード分析の違反を抑制するさまざまな方法について説明します。

EditorConfig ファイルを使用して違反を抑制する

ソリューションまたはプロジェクトの EditorConfig ファイルで、構成する各ルールのエントリを追加し、その重大度を none に設定します。 たとえば、dotnet_diagnostic.CA1822.severity = none のようにします。 詳細については、「EditorConfig ファイルでルールの重大度を手動構成する」を参照してください。 EditorConfig ファイルを追加するには、「EditorConfig ファイルをプロジェクトに追加する」を参照してください。

ソース コードの違反を抑制する

プリプロセッサ ディレクティブを使用して、ソース コード内の違反を抑制でき、これによって、特定のコード行の違反を抑制できます。

または、SuppressMessageAttribute 属性を使用して、C# および Visual Basic コードで警告を抑制することもできます。

コード エディターを使用して違反を抑制する

コード エディターを使用して違反を抑制するには、次の手順に従います。

  1. 違反があるコード行にカーソルを置き、Ctrl+ピリオド (.) または Alt+Enter を押して、[クイック アクション] メニューを開きます。

  2. [問題の抑制または構成]>[<ルール番号>の抑制] を選択し、[ソース内] または [ソース内 (属性)] を選択します。

    • [ソース内] を選択した場合は、コードに追加されるプリプロセッサ ディレクティブのプレビューが表示されます。

      [クイック アクションの抑制] メニューでの [ソース内] の選択を示すスクリーンショット。

    • [ソース内 (属性)] を選択した場合は、コードに追加される SuppressMessageAttribute 属性 のプレビューが表示されます。

      [クイック アクションの抑制] メニューでの [ソース内 (属性)] の選択を示すスクリーンショット。

[エラー一覧] を使用して違反を抑制する

[エラー一覧] ウィンドウを使用して違反を抑制するには、次の手順に従います。

  1. [エラー一覧] ウィンドウで、抑制するルールを選択します。

  2. 右クリックし、[抑制]>[ソース内] を選択します。

    [変更のプレビュー] ダイアログが開き、ソース コードに追加された C# #pragma 警告ディレクティブまたは Visual Basic #Disable 警告ディレクティブが表示されます。

    コード ファイルに #pragma 警告を追加するための [変更のプレビュー] ダイアログ ボックスを示すスクリーンショット。

  3. [適用] を選択して、コード ファイルに変更を保存します。

[エラー一覧] のビルド 診断を除外する

[エラー一覧] ウィンドウに [抑制] メニュー オプションが表示されない場合、違反はライブ分析ではなくビルドからである可能性があります。 [エラー一覧] ウィンドウには、診断すなわちルールの違反が、ライブ コード分析とビルドの両方から表示されます。 ビルド診断は古くなっている可能性があるため、たとえば、コードを編集して違反を修正してもリビルドしていない場合、[エラー一覧] で常にこれらの診断を抑制できるわけではありません。

ライブ分析すなわち IntelliSense の診断は、最新のソースを使用して常に最新状態であり、[エラー一覧] で常に抑制できるわけではありません。 選択からビルド診断を除外するには、次の手順に従います。

  1. [エラー 一覧] ソース フィルター ドロップダウン リストから、選択を [ビルド + IntelliSense] から [IntelliSense のみ] に変更します。

    エラー一覧のソース フィルターを示すスクリーンショット。

  2. 抑制する診断を選択し、前述の説明に従って続けます。

グローバル抑制ファイルを使用して違反を抑制する

グローバル抑制ファイルでは SuppressMessageAttribute 属性を使用して、コード違反を抑制します。

コード エディターからグローバル抑制ファイルを使用する

コード エディターを使用してグローバル抑制ファイルの違反を抑制するには、次の手順に従います。

  1. コード エディターで、違反のあるコード行にカーソルを置き、Ctrl+Period (.) または Alt+Enter を押して [クイック アクション] メニューを開きます。

  2. [<ルール番号>の抑制] を選択し、[抑制ファイル内] を選択します。

    Visual Studio は、タブをコード エディターで作成し、それには新しいグローバル抑制ファイルが含まれます。

[エラー一覧] からグローバル抑制ファイルを使用する

[エラー一覧] ウィンドウを使用してグローバル抑制ファイルの違反を抑制するには、次の手順に従います。

  1. [エラー一覧] ウィンドウで、抑制するルールを選択します。

  2. 右クリックし、[抑制]>[抑制ファイル内] を選択します。

    [変更のプレビュー] ダイアログが開き、グローバル抑制ファイルに追加された SuppressMessageAttribute 属性のプレビューが表示されます。

    抑制ファイル内の SuppressMessageAttribute 属性がある [変更のプレビュー] ダイアログ ボックスを示すスクリーンショット。

  3. [適用] を選択してグローバル抑制ファイルを保存します。

現在のすべての違反を抑制する

現在のすべての違反を抑制することは、基準と呼ばれることもあります。 ソリューションまたはプロジェクトのすべての現在の違反を抑制するには、次の手順に従います。

  1. Visual Studio のメニュー バーで、[分析]>[アクティブな問題のビルドと抑制] を選択します。

  2. ソリューション全体の違反を抑制するには [ソリューションの場合] を選択し、プロジェクトの違反のみを抑制するには [<プロジェクト名>の場合] を選択します。

プロジェクト設定を使用して違反を抑制する

ソリューション エクスプローラーのプロジェクト設定を使用して違反を抑制するには、次の手順に従います。

  1. [ソリューション エクスプローラー] でプロジェクトを選択します。

  2. 右クリックし、[プロパティ] を選択します (または Alt + Enter を押します)。

  3. [プロパティ] ウィンドウで、左側のペインから [コード分析] を選択し、[生成されたコードからの結果を抑制する] をオフにします。

ルール セットを使用して違反を抑制する

ルール セット エディターから、名前の横のチェックボックスをオフにするか、[アクション][なし] に設定します。

ソース内抑制と SuppressMessageAttribute 属性

ソース内抑制 (ISS) では、警告を抑制するために SuppressMessageAttribute 属性を使用します。 警告を生成したコード セグメントの近くのソース ファイルに SuppressMessageAttribute 属性を追加できます。

コード エディターで属性を手動で入力するか、次のようにして属性を自動的に追加できます。

  1. コード エディターで、違反のあるコード行にカーソルを置き、Ctrl+Period (.) または Alt+Enter を押して [クイック アクション] メニューを開きます。

  2. [クイック アクション] メニューから [問題の抑制または構成]>[<ルール番号>の抑制] を選択します。

  3. 次のいずれかの手順を実行します。

    • [ソース内 (属性)] を選択します。

      Visual Studio は、コードに SuppressMessageAttribute 属性を追加します。

    • [抑制ファイル内] を選択します。

      Visual Studio は、SuppressMessageAttribute 属性がある新しいグローバル抑制ファイルを含むタブをコード エディターで作成します。

SuppressMessageAttribute 属性は、条件付き属性であり、マネージド コード アセンブリのメタデータに含まれています。 この属性は、コンパイル時に CODE_ANALYSIS コンパイル シンボルが定義される場合に限り、含められます。

C++ および CLI コードでのみ、マクロ CA_SUPPRESS_MESSAGE または CA_GLOBAL_SUPPRESS_MESSAGE をヘッダー ファイルで使用して、属性を追加します。

プロジェクトを Visual Studio の最新バージョンに移行すると、コード分析の警告が多数表示される場合があります。 警告を修正する準備ができていない場合は、[分析]>[アクティブな懸案事項のビルドと抑制] を選択することで、すべての警告を抑制できます。

Note

ソース内抑制メタデータが誤って配布されるのを防ぐため、リリース ビルドではソース内抑制を使用しないでください。

SuppressMessageAttribute 属性の形式

SuppressMessageAttribute 属性の形式は次のとおりです。

[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]

属性には次のプロパティがあります。

  • Category: ルールのカテゴリです。 コード分析ルールのカテゴリの詳細については、「コード品質ルール」を参照してください。

  • CheckId: ルールの識別子です。 規則識別子の短い名前と長い名前の両方がサポートされます。 短い名前は CAXXXX、 長い名前は CAXXXX:FriendlyTypeName.です。

  • Justification: メッセージを抑制する理由を文書化するために使用されるテキストです。

  • MessageId: 各メッセージの問題の一意識別子です。

  • Scope: 警告が抑制されているターゲットです。 ターゲットを指定しないと、システムでは属性のターゲットに設定されます。 サポートされるスコープは、次のとおりです。

    • module: このスコープを指定すると、アセンブリに対する警告が抑制されます。 これは、プロジェクト全体に適用されるグローバルな抑制です。

    • resource: (レガシ FxCop のみ) このスコープを指定すると、モジュール (アセンブリ) の一部であるリソース ファイルに書き込まれる診断情報の警告が抑制されます。 Roslyn アナライザー診断用の C#/VB コンパイラでは、このスコープを読み取ることも適用することもありません。ソース ファイルを分析するだけです。

    • type: このスコープを指定すると、型に対する警告が抑制されます。

    • member: このスコープを指定すると、メンバーに対する警告が抑制されます。

    • namespace: このスコープを指定すると、名前空間自体に対する警告が抑制されます。 名前空間内の型に対する警告は抑制されません。

    • namespaceanddescendants: (コンパイラ バージョン 3.x 以降と Visual Studio 2019 以降が必要) このスコープを指定すると、名前空間とそのすべての子孫のシンボルで警告が抑制されます。 従来の分析では、namespaceanddescendants 値は無視されます。

  • Target: 警告が抑制されるターゲットを指定する識別子です。 完全修飾項目名が含まれている必要があります。

Visual Studio で警告を表示するときに、グローバル抑制ファイルに抑制を追加することで、SuppressMessageAttribute の例を見ることができます。 抑制属性とその必須プロパティが、プレビュー ウィンドウに表示されます。

SuppressMessageAttribute の使用

コード分析の警告は、SuppressMessageAttribute 属性が適用されるレベルで抑制されます。 たとえば、アセンブリ、モジュール、型、メンバー、またはパラメーターのレベルで属性を適用できます。 この属性を適用することの目的は、違反が発生するコードに対して抑制情報を密接に結合することです。

抑制の一般的な形式には、規則のカテゴリと規則の識別子が含まれ、これには人が判読できる規則名の表現が含まれています。 たとえば次のような点です。

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

パフォーマンス上の厳密な理由があり、ソース内抑制メタデータを最小限に抑える場合は、規則名を省略できます。 規則のカテゴリとその規則 ID により、十分に一意な規則識別子が形成されます。 次に例を示します。

[SuppressMessage("Microsoft.Design", "CA1039")]

メンテナンスしやすさの理由で、規則名を省略することは推奨されません。

メソッド本体内の選択的違反を抑制する

抑制属性をメソッドに適用することはできますが、メソッド本体内に埋め込むことはできません。 SuppressMessageAttribute 属性をメソッドに追加した場合に、特定の規則のすべての違反が抑制されます。

場合によっては、違反の特定のインスタンスを抑制することが必要になることがあります。 将来のコードがコード分析ルールから自動的に除外されない例を考えてみます。 特定のコード分析規則を使用すると、SuppressMessageAttribute 属性の MessageId プロパティを使用して、違反の特定のインスタンスを抑制することができます。 一般に、特定のシンボル (ローカル変数またはパラメーター) での違反に関する従来の規則では、MessageId プロパティが考慮されます。 CA1500:VariableNamesShouldNotMatchFieldNames は、このような規則の一例です。 ただし、実行可能コード (非シンボル) での違反に関する従来の規則では、MessageId プロパティは考慮されません。 また、.NET Compiler Platform ("Roslyn") アナライザーでは、MessageId プロパティは考慮されません。

特定のシンボルでの規則の違反を抑制するには、SuppressMessageAttribute 属性の MessageId プロパティでシンボル名を指定します。 次の例で示すコードには、CA1500:VariableNamesShouldNotMatchFieldNames の違反が 2 つあります。1 つの違反は name 変数に関するもので、もう 1 つの違反は age 変数に関するものです。 抑制されるのは、age シンボルに関する違反のみです。

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

グローバル レベルの抑制

マネージド コード分析ツールでは、アセンブリ、モジュール、型、メンバー、またはパラメーターのレベルで適用されている SuppressMessageAttribute 属性が調べられます。 また、リソースと名前空間に対する違反も送信されます。 これらの違反は、グローバル レベルで適用される必要があり、スコープおよびターゲットが設定されます。 たとえば、次のメッセージでは、名前空間の違反が抑制されます。

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

グローバル レベルの抑制の場合:

  • namespace スコープで警告を抑制すると、名前空間自体に対する警告が抑制されます。 名前空間内の型に対する警告は抑制されません。

  • Target には、常に、完全修飾された項目名が含まれます。

  • 明示的なスコープを指定することで、任意の抑制を表現できます。 これらの抑制は、グローバル レベルで指定する必要があります。 型を変更することによって、メンバー レベルの抑制を指定することはできません。

  • 明示的に提供されたユーザー ソースにマップされないコンパイラ生成のコードを参照するメッセージを抑制する唯一の方法は、グローバル レベルでの抑制です。 たとえば、次のコードは、コンパイラによって出力されたコンストラクターに対する違反を抑制します。

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

グローバル抑制ファイル

グローバル抑制ファイルには、グローバル レベルの抑制またはターゲット指定のない抑制のいずれかが保持されます。 たとえば、アセンブリ レベルの違反の抑制は、このファイルに格納されます。 また、フォームの分離コードではプロジェクト レベルの設定を使用できないため、ASP.NET の一部の抑制はこのファイルに格納されます。 [エラー一覧] ウィンドウで [抑制] コマンドの [プロジェクト抑制ファイル内] オプションを初めて選択した時点で、Visual Studio によってグローバル抑制ファイルが作成され、プロジェクトに追加されます。

モジュールの抑制スコープ

module スコープを使用すると、アセンブリ全体のコード品質違反を抑制できます。

たとえば、GlobalSuppressions プロジェクト ファイルで次の属性を指定すると、ASP.NET Core プロジェクトの ConfigureAwait 違反が抑制されます。

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

生成されたコード

マネージド コードのコンパイラと一部の外部ツールにより、コードの迅速な開発を容易にするコードが生成されます。 ソース ファイルに含まれるコンパイラ生成コードは、通常、GeneratedCodeAttribute 属性でマークされます。

ソース コード分析では、生成されたコードでのメッセージを .editorconfig ファイルで抑制できます。 詳細については、「生成されたコードを除外する」を参照してください。

従来のコード分析の場合は、生成されたコードに対するコード分析の警告とエラーを抑制するかどうかを選択できます。 そのような警告やエラーを抑制する方法の詳細については、「生成されたコードの警告を抑制する」を参照してください。

Note

GeneratedCodeAttribute をアセンブリ全体または単一のパラメーターのいずれかに適用すると、コード分析で無視されます。