次の方法で共有


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

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

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

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

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

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

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

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

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

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

  2. [ 問題の抑制または構成>Suppress <rule number>を選択し、 ソース または ソース (属性) で選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

診断情報はライブ分析(IntelliSense)から常に現在のソースに基づきup-to-dateされており、エラー一覧からいつでも無効化できます。 選択からビルド診断を除外するには、次の手順に従います。

  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. [クイック アクション] メニューの [><Suppress >rule number を選択します。

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

    • ソース (属性) で選択します。

      Visual Studio によって、コードに SuppressMessageAttribute 属性が追加されます。

    • 抑制ファイルで選択します

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

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

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

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

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

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属性をメソッドに追加すると、特定の規則のすべての違反は抑制されます。

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

ルールの特定のシンボル違反を抑制するには、MessageId属性のSuppressMessageAttributeプロパティのシンボル名を指定します。 次の例は、 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 ファイルで抑制できます。 詳細については、「 生成されたコードを除外する」を参照してください。

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

コード分析では、アセンブリ全体または 1 つのパラメーターに適用されている場合、 GeneratedCodeAttribute は無視されます。