跳到主要内容

.NET Code Analysis (CA)

.NETのコード分析(Code Analysis)は、コードの品質、スタイル、パフォーマンス、セキュリティの問題を検出し、開発の初期段階で修正するための静的解析機能です。現代の.NET開発では、Roslynコンパイラプラットフォームに基づいた「Roslyn Analyzers」が標準的に使用されています。

Code Analysis (CA) とは

Code Analysisは、コンパイル時にソースコードを検査し、潜在的なバグやコーディング規約違反を報告する仕組みです。

主な特徴

  • リアルタイムフィードバック: Visual StudioやVS CodeなどのIDEで、コードを書いている最中に警告やエラーが表示されます。
  • ビルド時の検証: CI/CDパイプライン上でコードの品質を強制することができます。
  • カスタマイズ可能: ルールの有効/無効や重大度(Severity)を細かく設定できます。

従来のFxCopとの違い

かつては「FxCop」と呼ばれる静的解析ツールが使われていましたが、現在はRoslyn Analyzers(.NET Analyzer)に統合されています。FxCopはコンパイル後のアセンブリを解析していましたが、Roslyn Analyzersはソースコードを解析するため、よりリッチで高速なフィードバックが可能です。

ルールの種類

.NET SDKには数多くの分析ルールが含まれています。これらは主に以下のカテゴリに分類されます。

1. コード品質ルール (CAxxxx)

API設計、セキュリティ、パフォーマンス、信頼性などの問題を検出します。

  • Design: ライブラリ設計のガイドラインに従っているか(例: インターフェイスの実装方法)。
  • Performance: パフォーマンスに悪影響を与えるコードを検出(例: 不必要な文字列連結)。
  • Security: セキュリティホールになり得る脆弱なコードを検出。
  • Reliability: アプリケーションの動作を不安定にする可能性のある記述を検出。
  • Usage: Frameworkの正しい使用方法に関わるルール。

2. コードスタイルルール (IDExxxx)

コードの可読性やフォーマットの一貫性に関わるルールです。

  • var の使用方針
  • 中括弧 {} の省略可否
  • 名前空間の宣言スタイル(File-scoped namespaceなど)

3. サードパーティ製アナライザー

NuGetパッケージとして導入できる追加のアナライザーもあります。

  • StyleCop.Analyzers: 厳しいスタイルガイドラインを適用したい場合。
  • SonarAnalyzer.CSharp: SonarQube準拠の詳細な解析。
  • xUnit.Analyzers: テストコード専用のベストプラクティスチェック。

設定と構成

.NETのコード分析の動作は、主にプロジェクトファイル(.csproj)と.editorconfigファイルで制御します。

プロジェクトファイルでの設定

プロジェクト全体に対する分析レベルを設定します。

<PropertyGroup>
<!-- すべての警告をエラーとして扱う(推奨) -->
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

<!-- .NETのコード分析機能を有効化(.NET 5以降はデフォルトでtrue) -->
<EnableNETAnalyzers>true</EnableNETAnalyzers>

<!-- 分析レベルの指定(latestは最新のSDK推奨設定を使用) -->
<AnalysisLevel>latest</AnalysisLevel>

<!-- 推奨設定をすべて有効にするかどうか -->
<AnalysisMode>All</AnalysisMode>
</PropertyGroup>

.editorconfig による詳細設定

.editorconfig を使用すると、個別のルールごとに重大度(Severity)を設定できます。リポジトリのルートに配置することで、すべてのプロジェクトに適用されます。

重大度 (Severity) のレベル

  • error: ビルドを失敗させる。直ちに修正が必要。
  • warning: ビルドは成功するが警告を表示する(TreatWarningsAsErrorsが有効ならビルド失敗)。
  • suggestion: IDE上で「・・・」のようなヒントを表示する。ビルドログには残らない。
  • silent: エディタ上での強調表示はしないが、修正案(電球アイコン)としては利用可能。
  • none: ルールを無効にする。

設定例

# .editorconfig

# ファイルごとの設定
[*.cs]

#### コア分析ルール ####

# CA1062: パブリックメソッドの引数のnullチェックを検証
dotnet_diagnostic.CA1062.severity = error

# CA1822: 静的メンバーとしてマークできるメンバーを指摘
dotnet_diagnostic.CA1822.severity = warning

# CA2007: ConfigureAwait を使用するかどうかのチェック(ASP.NET Coreでは不要なので無効化)
dotnet_diagnostic.CA2007.severity = none

#### スタイルルール ####

# var の使用を強制 (csharp_style_var_for_built_in_types)
csharp_style_var_for_built_in_types = true:suggestion

# File-scoped namespaceの使用を推奨
csharp_style_namespace_declarations = file_scoped:warning

ベストプラクティス

1. 警告ゼロを目指す (TreatWarningsAsErrors)

本番品質のコードでは、<TreatWarningsAsErrors>true</TreatWarningsAsErrors> を設定し、警告をエラーとして扱うことを推奨します。警告を放置すると、重要な問題が見逃される「割れ窓理論」のような状態になります。

2. .editorconfig を階層的に管理する

  • ルートディレクトリ: 全体共通の厳格なルール。
  • テストプロジェクト: 一部のルール(命名規則やドキュメント要否など)を緩和する設定で上書きする。

3. AnalysisLevel の定期更新

.NET SDK のアップデートに伴い、新しいルールが追加されます。<AnalysisLevel>latest</AnalysisLevel> にしておくと自動的に新しいルールが適用されますが、SDK更新時にビルドが壊れるリスクがあります。安定性を重視する場合は <AnalysisLevel>8.0</AnalysisLevel> のようにバージョンを固定し、計画的にバージョンを上げましょう。

4. チームでの合意形成

すべてのルールを有効にすると開発速度が落ちる可能性があります。チームにとって「ノイズ」となるルールは躊躇なく none に設定し、本当に守るべきルールだけを errorwarning に設定しましょう。

まとめ

適切なコード分析の導入は、コードレビューの負担を減らし、品質を自動的に担保するための強力な手段です。.NET標準の機能と .editorconfig を活用して、チームに合った解析環境を構築しましょう。


関連リソース