.NET ソース コード分析の概要

.NET のコンパイラ プラットフォーム (Roslyn) アナライザーでは、お使いの C# または Visual Basic コードについて、コードの品質やスタイルに関する問題を検査できます。 .NET 5 以降、これらのアナライザーは .NET SDK に含まれており、個別にインストールする必要はありません。 プロジェクトが .NET 5 以降をターゲットとしている場合は、既定でコード分析が有効になっています。 プロジェクトが .NET Core、.NET Standard、.NET Framework などの別の .NET 実装をターゲットとしている場合は、EnableNETAnalyzers プロパティを true に設定することにより、コード分析を手動で有効にする必要があります。

.NET 5 以降の SDK に移行しない場合、SDK スタイル以外の .NET Framework プロジェクトを使用する場合、または NuGet パッケージベースのモデルを使用する場合は、Microsoft.CodeAnalysis.NetAnalyzers NuGet パッケージでアナライザーを使用することもできます。 オンデマンドのバージョン更新には、パッケージベースのモデルを使用することをお勧めします。

注意

.NET アナライザーは、ターゲット フレームワークに依存しません。 つまり、プロジェクトが特定の .NET 実装をターゲットにする必要はありません。 アナライザーは、.NET 5+ を対象とするプロジェクトと、.NET Core 3.1 や .NET Framework 4.7.2 などの以前のバージョンの .NET を対象とするプロジェクトで機能します。 ただし、EnableNETAnalyzers プロパティを使用してコード分析を有効にするには、プロジェクトがプロジェクト SDK を参照する必要があります。

アナライザーによってルール違反が検出されると、各ルールの構成方法に応じて、修正候補、警告、またはエラーとして報告されます。 コード分析違反は、コンパイラ エラーと区別するために "CA" または "IDE" というプレフィックスで示されます。

コード品質の分析

コード品質の分析 ("CAxxxx") ルールでは、お使いの C# コードまたは Visual Basic コードにセキュリティ、パフォーマンス、設計などの問題がないか検査が行われます。 分析は、.NET 5 以降をターゲットとするプロジェクトで既定で有効になっています。 EnableNETAnalyzers プロパティを true に設定すると、以前のバージョンの .NET を対象とするプロジェクトで、.NET コード分析を有効にできます。 EnableNETAnalyzersfalse に設定すると、自分のプロジェクトでコード分析を無効にすることもできます。

ヒント

Visual Studio を使用する場合、多くのアナライザー ルールには、"コード修正" が関連付けられており、これを適用して問題を修正できます。 コード修正は、電球アイコン メニューに示されます。

有効なルール

.NET 7 では、既定で次の規則が有効になっています。

診断 ID カテゴリ 重大度 説明
CA1416 相互運用性 警告 プラットフォームの互換性を検証する
CA1417 相互運用性 警告 P/Invoke の文字列パラメーターに OutAttribute を使用しないでください
CA1418 相互運用性 警告 有効なプラットフォーム文字列を使用します
CA1420 相互運用性 警告 ランタイム マーシャリングが必要な機能を無効にした場合に使用すると、実行時の例外が発生します
CA1422 相互運用性 警告 プラットフォームの互換性を検証する
CA1831 パフォーマンス 警告 該当する場合、文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します
CA2013 [信頼性] 警告 値の型に ReferenceEquals を使用しないでください
CA2014 [信頼性] 警告 ループで stackalloc を使用しないでください
CA2015 [信頼性] 警告 MemoryManager<T> から派生した型にはファイナライザーを定義しないでください
CA2017 [信頼性] 警告 パラメーター カウントが一致しません
CA2018 [信頼性] 警告 Buffer.BlockCopy に対する引数 count で、コピーするバイト数を指定する必要があります
CA2200 使用法 警告 スタック詳細を保持するために再度スローします
CA2252 使用 エラー プレビュー機能をオプトインします
CA2247 使用法 警告 TaskCompletionSource コンストラクターに渡される引数は、TaskContinuationOptions ではなく TaskCreationOptions 列挙型にする必要があります
CA2255 使用法 警告 ModuleInitializer 属性をライブラリ内で使用しないでください
CA2256 使用法 警告 親インターフェイスで宣言されたメンバーはすべて、DynamicInterfaceCastableImplementation 属性インターフェイスに実装されている必要があります
CA2257 使用法 警告 DynamicInterfaceCastableImplementationAttribute を持つインターフェイスで定義されるメンバーは、static とする必要があります
CA2258 使用法 警告 Visual Basic で DynamicInterfaceCastableImplementation インターフェイスを指定することは、サポートされていません
CA2259 使用 ThreadStatic 静的フィールドにのみ影響します
CA2260 使用 正しい型パラメーターを使用する

これらのルールの重要度を変更して、無効にするか、エラーに昇格させることができます。 追加のルールを有効にすることもできます。

  • 各 .NET SDK バージョンに含まれるルールの一覧については、アナライザーのリリースに関するページを参照してください。
  • すべてのコード品質ルールの一覧については、「コード品質ルール」を参照してください。

追加のルールを有効にする

"分析モード" とは、事前に定義されたコード分析構成 (いずれのルールも有効になっていない、一部またはすべてのルールが有効になっている) を意味します。 既定の分析モードでは、少数のルールのみがビルド警告として有効になっています。 プロジェクト ファイルで AnalysisMode> プロパティを設定することで、プロジェクトの<分析モードを変更できます。 次の値を使用できます。

None

Default

Minimum

Recommended

All

.NET 6 以降では、AnalysisLevel> プロパティの複合値を優先して AnalysisMode> を省略<できます。< たとえば、次の値を使用すると、最新リリースに対して推奨される規則セットが有効になります: <AnalysisLevel>latest-Recommended</AnalysisLevel>。 詳細については、「AnalysisLevel」を参照してください。

使用可能な各ルールの既定の重要度と、既定の分析モードでルールが有効になっているかどうかを確認するには、ルールの完全な一覧を参照してください。

警告をエラーとして扱う

プロジェクトをビルドするときに -warnaserror フラグを使用すると、すべてのコード分析の警告もエラーとして扱われます。 -warnaserror の存在下でコード品質の警告 (CAxxxx) がエラーとして扱われないようにするには、プロジェクト ファイル内の CodeAnalysisTreatWarningsAsErrors MSBuild プロパティを false に設定します。

<PropertyGroup>
  <CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>

コード分析の警告は引き続き表示されますが、ビルドが中断することはありません。

最新の更新プログラム

既定では、新しいバージョンの .NET SDK にアップグレードするときに、最新のコード分析ルールと、ルールの既定の重要度を取得します。 この動作が望ましくない (たとえば、新しいルールが有効または無効にならないようにする) 場合は、次のいずれかの方法でオーバーライドできます。

  • AnalysisLevel MSBuild プロパティを特定の値に設定して、警告をそのセットにロックします。 より新しい SDK にアップグレードすると、これらの警告のバグ修正が引き続き表示されますが、新しい警告は有効にならず、既存の警告は無効になりません。 たとえば、ルールのセットを、.NET SDK バージョン 5.0 に付属するセットにロックするには、プロジェクト ファイルに次のエントリを追加します。

    <PropertyGroup>
      <AnalysisLevel>5.0</AnalysisLevel>
    </PropertyGroup>
    

    ヒント

    AnalysisLevel プロパティの既定値は latest です。これは、より新しいバージョンの .NET SDK に移行するときに、常に最新のコード分析ルールを取得することを意味します。

    詳細情報、および使用可能な値の一覧については、「AnalysisLevel」を参照してください。

  • Microsoft.CodeAnalysis.NetAnalyzers NuGet パッケージをインストールして、.NET SDK の更新プログラムからルールの更新を分離します。 .NET 5 以降をターゲットとするプロジェクトでは、パッケージをインストールすると、組み込みの SDK アナライザーがオフになります。 NuGet パッケージよりも新しいバージョンのアナライザー アセンブリが SDK に含まれている場合は、ビルド警告が表示されます。 警告を無効にするには、_SkipUpgradeNetAnalyzersNuGetWarning プロパティを true に設定します。

    注意

    Microsoft.CodeAnalysis.NetAnalyzers NuGet パッケージをインストールする場合は、プロジェクト ファイルまたは Directory.Build.props ファイルに EnableNETAnalyzers プロパティを追加しないでください。 NuGet パッケージがインストールされ、EnableNETAnalyzers プロパティが true に設定されると、ビルド警告が生成されます。

コードスタイルの分析

"コードスタイルの分析" ("IDExxxx") ルールを使用すると、コードベースで一貫性のあるコードスタイルを定義および維持することができます。 既定の有効化設定は次のとおりです。

  • コマンドライン ビルド: コードスタイルの分析は、既定でコマンドライン ビルドのすべての .NET プロジェクトに対して無効になっています。

    .NET 5 以降では、コマンド ラインと Visual Studio 内の両方で、ビルド時にコードスタイルの分析を有効にすることができます。 コード スタイルに違反すると、"IDE" プレフィックスが付いた警告またはエラーが表示されます。 これにより、ビルド時に一貫したコード スタイルを適用できます。

  • Visual Studio: コードスタイルの分析は、既定で Visual Studio 内のすべての .NET プロジェクトに対してコード リファクタリングのクイック アクションとして有効になっています。

コードスタイルの分析ルールの完全な一覧については、「コードスタイル ルール」を参照してください。

ビルド時に有効にする

.NET 5 SDK 以降のバージョンでは、コマンドラインから、および Visual Studio 内でビルドするときに、コードスタイルの分析を有効にすることができます。 (ただし、パフォーマンス上の理由から、いくつかのコードスタイル ルールは Visual Studio IDE にのみ適用されます)。

ビルド時にコードスタイルの分析を有効にするには、次の手順に従います。

  1. MSBuild プロパティ EnforceCodeStyleInBuildtrue に設定します。

  2. .editorconfig ファイルで、ビルド時に実行する各 "IDE" コード スタイル ルールを警告またはエラーとして構成します。 次に例を示します。

    [*.{cs,vb}]
    # IDE0040: Accessibility modifiers required (escalated to a build warning)
    dotnet_diagnostic.IDE0040.severity = warning
    

    また、既定では、カテゴリ全体を警告またはエラーとして構成してから、ビルド時に実行しないカテゴリのルールを選択的にオフにすることもできます。 次に例を示します。

    [*.{cs,vb}]
    
    # Default severity for analyzer diagnostics with category 'Style' (escalated to build warnings)
    dotnet_analyzer_diagnostic.category-Style.severity = warning
    
    # IDE0040: Accessibility modifiers required (disabled on build)
    dotnet_diagnostic.IDE0040.severity = silent
    

注意

コードスタイルの分析機能は試験段階にあり、.NET 5 リリースと .NET 6 リリースの間で変更される可能性があります。

警告を抑制する

ルール違反を抑制する方法の 1 つとして、EditorConfig ファイルでそのルール ID の重要度オプションを none に設定します。 次に例を示します。

dotnet_diagnostic.CA1822.severity = none

詳細情報、および警告を非表示にするその他の方法については、「コード分析の警告を抑制する方法」を参照してください。

コード分析を GitHub アクションとして実行する

dotnet/code-analysis GitHub アクションを使用すると、オフライン モードでの継続的インテグレーション (CI) の一部として .NET コード アナライザーを実行できます。 詳細については、.NET コード分析の GitHub アクションに関するページを参照してください。

サード パーティのアナライザー

公式の .NET アナライザーに加えて、StyleCopRoslynatorXUnit AnalyzersSonar Analyzer などのサードパーティ製アナライザーをインストールすることもできます。

関連項目