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

.NET のコンパイラ プラットフォーム (Roslyn) アナライザーでは、お使いの C# または Visual Basic コードについて、コードの品質やスタイルに関する問題を検査できます。 これらのアナライザーは .NET SDK に含まれており、個別にインストールする必要はありません。 プロジェクトが .NET 5 以降をターゲットとしている場合は、既定でコード分析が有効になっています。 (.NET Framework を対象とするプロジェクトでコード分析を有効にする方法については、「 レガシ プロジェクトでコード分析を有効にする」を参照してください)。

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

コード品質の分析

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

ヒント

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

有効なルール

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

診断 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 count に対する引数 Buffer.BlockCopy で、コピーするバイト数を指定する必要があります
CA2021 信頼性 警告 .NET 8 互換性のない型を指定して Enumerable.Cast<T> または Enumerable.OfType<T> を呼び出さないでください
CA2022 信頼性 警告 .NET 9 で読み取りを不正確にしないようにする Stream.Read
CA2023 信頼性 警告 .NET 10 メッセージ テンプレートの中かっこが無効です
CA2200 使用方法 警告 .NET 5 スタック詳細を保持するために再度スローします
CA2247 使用方法 警告 .NET 5 TaskCompletionSource コンストラクターに渡される引数は、TaskCreationOptions ではなく TaskContinuationOptions 列挙型にする必要があります
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.SuppressThrowing を Task<TResult> と共に使用しないでください
CA2264 使用方法 警告 .NET 9 null 非許容値を 〗〘〗 ArgumentNullException.ThrowIfNull
CA2265 使用方法 警告 .NET 9 Span<T>とnullを比較しないdefault

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

  • 各 .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.globalconfig ファイルを調べます。 (.NET 7 以前のバージョンの場合、ファイル拡張子は .editorconfigです)。
Recommended Minimum モードよりも積極的なモードであり、より多くの規則がビルド警告として有効になります。 これに含まれる規則を確認するには、%ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_recommended.globalconfig ファイルを調べます。 (.NET 7 以前のバージョンの場合、ファイル拡張子は .editorconfigです)。
All すべての規則がビルド警告として有効になっています*。 個々のルールを選択的にオプトアウトして無効にすることができます。

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

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

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

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

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

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

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

最新の更新

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

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

    <PropertyGroup>
      <AnalysisLevel>8.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 プロジェクトに対して既定で非対応です。

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

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

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

ビルド時に有効にする

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

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

  1. MSBuild プロパティ EnforceCodeStyleInBuild を true に設定します。

  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

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

レガシ プロジェクトでコード分析を有効にする

プロジェクトが .NET 5 以降をターゲットとしている場合は、既定でコード分析が有効になっています。 プロジェクトが .NET Standard または .NET Framework を対象とする場合は、 EnableNETAnalyzers プロパティを true に設定して、コード分析を手動で有効にする必要があります。

プロジェクトでレガシ プロジェクト ファイル形式が使用されている場合、つまりプロジェクト SDK を参照していない場合は、コード分析を有効にするために実行する必要がある追加の手順がいくつかあります。

  1. 📦 Microsoft.CodeAnalysis.NetAnalyzers NuGet パッケージへの参照を追加します。
  2. SDK スタイル以外のプロジェクトでは認識されない AnalysisLevelを設定する代わりに、プロジェクト ファイルに次のプロパティを追加します。
  <EffectiveAnalysisLevel>9</EffectiveAnalysisLevel>
  <AnalysisMode>Recommended</AnalysisMode>

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

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

関連項目