.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 パッケージでアナライザーを使用することもできます。 オンデマンドのバージョン更新には、パッケージベースのモデルを使用することをお勧めします。

Note

.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 を対象とするプロジェクトでコード分析を有効にできます。 EnableNETAnalyzersfalse に設定すると、自分のプロジェクトでコード分析を無効にすることもできます。

ヒント

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

有効なルール

.NET 8 では、既定で、次の規則がエラーまたは警告として有効になっています。 他の規則は、提案として有効になっています。

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

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

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

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

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

説明
None すべてのルールが無効になっています。 個々の規則を選択的にオプトインして有効にすることができます。
Default 既定のモードでは、特定のルールがビルド警告として有効になり、特定のルールが Visual Studio IDE の提案として有効になり、残りは無効になります。
Minimum Default モードよりも積極的なモード。 ビルドの実施のために強く推奨される特定の提案が、ビルドの警告として有効になります。 これに含まれる規則を確認するには、%ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_minimum.editorconfig ファイルを調べます。
Recommended Minimum モードよりも積極的なモードであり、より多くの規則がビルド警告として有効になります。 これに含まれる規則を確認するには、%ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_recommended.editorconfig ファイルを調べます。
All すべての規則がビルド警告として有効になっています*。 個々のルールを選択的にオプトアウトして無効にすることができます。

* 次の規則は、AnalysisModeAll に設定するか、AnalysisLevellatest-all に設定しても有効に "なりません": CA1017、CA1045、CA1005、CA1014、CA1060、CA1021、およびコード メトリック アナライザー規則 (CA1501、CA1502、CA1505、CA1506、CA1509)。 これらのレガシ規則は将来のバージョンで非推奨になる可能性があります。 ただし、dotnet_diagnostic.CAxxxx.severity = <severity> エントリを使って個別に有効にすることはできます。

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

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

の警告をエラーとして扱う

プロジェクトをビルドするときに -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 に設定します。

    Note

    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
    

    ヒント

    .NET 9 以降では、オプションの書式を使用して重大度を指定し、ビルド時に遵守させることもできます。 次に例を示します。

    [*.{cs,vb}]
    # IDE0040: Accessibility modifiers required (escalated to a build warning)
    dotnet_style_require_accessibility_modifiers = always: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
    

警告を抑制する

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

dotnet_diagnostic.CA1822.severity = none

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

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

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

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

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

関連項目