.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 を対象とするプロジェクトでコード分析を有効にできます。 EnableNETAnalyzers
を false
に設定すると、自分のプロジェクトでコード分析を無効にすることもできます。
ヒント
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> を呼び出さないでください |
CA2022 | 信頼性 | 警告 | .NET 9 | で読み取りを不正確にしないようにする Stream.Read |
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.SuppressThrowing を Task<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 |
すべての規則がビルド警告として有効になっています*。 個々のルールを選択的にオプトアウトして無効にすることができます。 * 次の規則は、 AnalysisMode を All に設定するか、AnalysisLevel を latest-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 にのみ適用されます)。
ビルド時にコードスタイルの分析を有効にするには、次の手順に従います。
MSBuild プロパティ EnforceCodeStyleInBuild を
true
に設定します。.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 アナライザーに加えて、StyleCop、Roslynator、XUnit Analyzers、Sonar Analyzer などのサードパーティ製アナライザーをインストールすることもできます。
関連項目
.NET