Nexta Tech Blog
🛠️

C#開発者向け .editorconfigでAI生成コードを整形 - Visual Studioでの実践ガイド

に公開

はじめに - AI時代のC#コード品質管理

GitHub CopilotやClaude Codeなど、AI支援ツールがC#開発に浸透してきました。しかし、AI生成コードには「スタイルの不統一」という課題があります。

  • あるメソッドでは var を使い、別のメソッドでは明示的な型指定
  • 古いC#スタイルの提案(new List<string>() vs new()
  • privateフィールドの命名規則が統一されない(_field vs field

これらを毎回手動で修正するのは非効率です。.editorconfigを使えば、AI生成後のコードをIDE(Visual Studio)が自動整形し、プロジェクトの規約に従わせることができます。

この記事を読むメリット

  • AI生成コードのスタイル不統一を自動解決できるようになる
  • コードレビュー時間を削減し、本質的なレビューに集中できる
  • チーム全体で統一されたコーディング規約を実現できる
  • 既存プロジェクトへの段階的導入方法を学べる
  • 実用的な設定テンプレートをすぐに使える

この記事で分かること

  • .editorconfigとは何か、Visual Studioでどのように使うか
  • 重大度レベル(severity)の使い分けと実践的な設定方法
  • AI生成コードとEditorConfigの実際の関係(AIは直接参照しないが、IDEが自動整形)
  • 既存プロジェクトへの段階的な導入戦略
  • 実用的な設定テンプレートとカスタマイズ例

本記事では、C#とVisual Studioに特化して、.editorconfigの実践的な活用方法を解説します。

前提条件

本記事は以下の環境を想定しています:

  • Visual Studio: 2019以降(2022推奨)
  • C#: 8.0以降(最新機能の例ではC# 10+を使用)
  • .NET: .NET Core 3.1以降、または.NET 5+

レガシーな.NET Framework 4.xでも.editorconfigは利用可能ですが、一部の新しいC#構文(レコード型、ファイルスコープ名前空間等)は使用できません。

EditorConfigとは?

前のセクションで、AI生成コードのスタイル不統一という課題を確認しました。ここでは、その解決策となる.editorconfigの基本を説明します。

.editorconfigは、エディターに依存しないコーディングスタイル設定ファイルです。プロジェクトのルートに配置することで、チーム全体で統一されたコーディング規約を設定できます。コードクリーンアッププロファイルの設定により、保存時やコードクリーンアップ時に自動適用することも可能です。

Visual Studioでのサポート

Visual Studio 2017以降、.editorconfigがネイティブサポートされています。特にC#では、Roslynアナライザーと連携することで機能を発揮します。

C#で何ができるのか?

.editorconfigでC#では以下のような設定が可能です:

  • 基本設定: インデント、改行、文字コード
  • 命名規則: privateフィールドに_、インターフェースにIプレフィックス
  • コードスタイル: varの使用、式形式メンバー、using配置
  • フォーマット: 中括弧の改行位置、スペース設定

具体的な設定例は、後述の「推奨設定テンプレート」を参照してください。

EditorConfigの「強制力」- 重大度レベルとは

.editorconfigの最も重要な特徴である重大度レベル(severity)について詳しく説明します。この理解により、プロジェクトに適した設定が可能になります。

.editorconfigの最も重要な特徴は、設定の重要度レベルを制御できることです。

重大度レベルの全体像(5段階)

Visual Studioでは、以下の5段階の重大度レベル(severity)が定義されています:

設定値 日本語表示 エディター表示 ビルド 用途
none 無効 表示なし 成功 ルールを無効化
silent リファクタリング 表示なし(自動整形) 成功 静かに修正
suggestion 提案事項 💡 灰色点線 成功 推奨スタイル
warning 警告 ⚠️ 緑波線 成功 警告表示
error エラー ❌ 赤波線 失敗 必須ルール

実務では、silent(リファクタリング)、suggestion(提案事項)、warning(警告)、error(エラー)の4つを使い分けます。 none(無効)はルールを書かないのと同じ効果のため、ほぼ使用しません。

以下、実用的な4つのレベルを詳しく解説します。


Level 1: リファクタリングのみ(silent)

ユーザーに通知せず、個別にリファクタリングを適用できます。

[*.cs]
# リファクタリングのみ(コードクリーンアップには参加しない)
dotnet_diagnostic.IDE0055.severity = silent

動作:

  • エディター上に視覚的な警告なし
  • Visual Studioのコード生成機能がこのスタイルに従う
  • クイックアクション(電球アイコン)から個別に適用可能
  • コードクリーンアップには参加しない(保存時の自動適用には含まれない)

Level 2: 推奨(suggestion)

コードに灰色の点線と電球アイコンが表示されます。

[*.cs]
# varの使用を推奨(電球アイコン表示)
csharp_style_var_when_type_is_apparent = true:suggestion

動作:

  • エディター上に灰色の点線
  • 電球アイコンでクイックフィックス提案
  • 「エラー一覧」ウィンドウには表示されない
  • ビルドは成功する

Level 3: 警告(warning)

コードに緑色の波線が表示され、警告リストに表示されます。

[*.cs]
# 中括弧の省略を警告
csharp_prefer_braces = true:warning

動作:

  • エディター上に緑の波線
  • 「エラー一覧」ウィンドウに警告表示
  • ビルドは成功する
  • CI/CDで /warnaserror を使うとエラー化可能

Level 4: エラー(error)

コードに赤色の波線が表示され、ビルドエラーとして扱われます。

[*.cs]
# privateフィールドの命名規則違反はビルドエラー
dotnet_naming_rule.private_fields_with_underscore.severity = error

# usingの配置ミスはビルドエラー
csharp_using_directive_placement = outside_namespace:error

動作:

  • エディター上に赤の波線
  • コンパイルが失敗する
  • CI/CDで自動的にブロック
  • 絶対遵守が必要なルールに使用
// ❌ ビルドエラー: IDE0065
namespace MyApp
{
    using System;  // error: usingはnamespace外に配置すべき
}

// ✅ 正しい
using System;

namespace MyApp
{
}

ポイント: severity = errorに設定することで、usingの配置ミスがビルドエラーになります。これにより、規約違反のコードをコミット前に検出できます。

Roslynアナライザーとの連携

Visual StudioのC#コンパイラー(Roslyn)は、.editorconfigの設定を診断ルールとして認識します。

主要な診断ID:

診断ID 内容 推奨severity
IDE0055 フォーマット規則違反 warning
IDE0001 名前の簡略化 suggestion
IDE0005 不要なusing warning
IDE0065 usingの配置 error
IDE0011 中括弧の追加 warning
[*.cs]
# すべてのフォーマット違反をエラー化(厳格)
dotnet_diagnostic.IDE0055.severity = error

# 不要なusingは警告のみ
dotnet_diagnostic.IDE0005.severity = warning

どんなメリットがあるのか?

✅ コードレビュー時間の削減

機械的にチェックできるスタイル指摘がゼロになります。

削減できるレビューコメント例:

  • 「privateフィールドには_をつけてください」
  • 「usingはnamespaceの外に出してください」
  • 「ここはvarを使った方が良いです」
  • 「インデントがずれています」

これらはすべて.editorconfigで自動チェック可能です。人間のレビュアーは、アーキテクチャやロジックなど本質的な部分に集中できます。

✅ CI/CD連携で品質担保

.editorconfigの設定は、CI/CD環境でも自動的にチェックできます。

CI/CDでの自動チェックの仕組み

.editorconfigの設定は、dotnet buildコマンドで自動的にチェックされます。

重要なポイント:

  • severity = warningの設定は、デフォルトではビルド成功
  • /warnaserrorオプションで警告をエラー化
  • CI/CD環境では厳格にチェック、ローカルでは柔軟に運用可能

実行例:

# ローカル開発(警告は表示されるがビルド成功)
dotnet build

# CI/CD環境(警告をエラー化してビルド失敗させる)
dotnet build /warnaserror

# 特定のWarningのみエラー化
dotnet build /warnaserror:IDE0055,IDE1006

これにより、開発者のローカル環境では柔軟に開発しつつ、マージ時には厳格にチェックする運用が可能です。

GitHub Actionsの例:

# .github/workflows/build.yml
- name: Build
  run: dotnet build --configuration Release /p:TreatWarningsAsErrors=true

プルリクエスト時点で自動的にスタイル違反をブロックできます。

AIとEditorConfigの実践的な関係

重大度レベルの理解ができたところで、冒頭で触れた「AI生成コードを整形」の実際の仕組みと実践的な活用方法を詳しく解説します。

AIコーディングエージェントの動作原理

現在、多くのAIコーディングエージェントが登場しています:

  • GitHub Copilot (Agent Mode)
  • Claude Code
  • Cursor (Agent Mode)
  • Windsurf (Cascade)
  • Cline (VS Code拡張)
  • JetBrains Junie

これらのAIエージェントは、以下の情報からコーディングスタイルを推測します:

  • 既存コードのパターン: プロジェクト内の既存コードから学習
  • コンテキスト: 周辺のコードスタイルを参考にする
  • トレーニングデータ: 大量のOSSコードから学習した一般的なパターン

重要なポイント: 通常、.editorconfigファイルを自動的に読み取る機能は存在しません。

実際、GitHub Copilotのコミュニティディスカッションでは、フォーマット設定を正しく尊重しないという報告が多数寄せられています(Visual Studio 17.5~17.8系で継続的に問題が発生)。

AI生成コードの実際の課題と解決策

課題1: 古いC#スタイルの提案

GitHub Copilotは、トレーニングデータの影響で古いC#スタイルを提案することがあります。

例: ターゲット型new演算子の未使用

// ❌ Copilotが提案するコード(C# 9.0以前のスタイル)
List<string> names = new List<string>();
Dictionary<int, string> map = new Dictionary<int, string>();

// ✅ .editorconfigで自動修正後(C# 9.0以降)
List<string> names = new();
Dictionary<int, string> map = new();

ポイント: AIが古いスタイルを提案しても、コードクリーンアッププロファイルの設定により、保存時やコードクリーンアップ時に最新のC#スタイルに自動変換されます。開発者は手動で修正する必要がありません。

.editorconfig設定:

[*.cs]
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning

自動修正の設定:

warning/errorレベルの設定を自動修正するには、コードクリーンアッププロファイルに「EditorConfig で設定されたすべての警告とエラーを修正」を追加する必要があります。詳細は「コードクリーンアッププロファイルの設定」セクションを参照してください。

課題2: プロンプトでC#規約を毎回説明する非効率さ

AI支援ツールにコード生成を依頼する際、毎回スタイルを説明するのは非効率です。

.editorconfigを使えば、プロンプトがシンプルに:

「新しいUserServiceクラスを作成してください」

AI生成後、IDE側の保存時フォーマットが自動的にスタイルを整えます。

課題3: 命名規則違反の検出

AI生成コードは、プロジェクトの命名規則に従わないことがあります。

例: privateフィールドの命名

// ❌ AIが生成したコード
public class UserService
{
    private readonly ILogger logger;  // アンダースコアなし
    private readonly HttpClient client;

    public UserService(ILogger logger, HttpClient client)
    {
        this.logger = logger;
        this.client = client;
    }
}

ポイント: AIが命名規則に従わないコードを生成しても、ビルドエラーで検出できます。クイックフィックスで一括修正も可能です。

.editorconfig設定:

[*.cs]
# privateフィールドは _camelCase を強制
dotnet_naming_rule.private_fields_with_underscore.severity = error
dotnet_naming_rule.private_fields_with_underscore.symbols = private_fields
dotnet_naming_rule.private_fields_with_underscore.style = prefix_underscore

dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private

dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _

結果:

Error IDE1006: Naming rule violation: These words must begin with upper case characters: logger
Error IDE1006: Naming rule violation: These words must begin with upper case characters: client

ビルドエラーになるため、気づかずにコミットできません。

AIエージェントにEditorConfigを参照させる方法

方法1: 明示的にファイル参照(推奨)

開発者が明示的に.editorconfigをコンテキストに含めれば、AIエージェントは内容を読み取って従います:

GitHub Copilot(Agent Mode):

@workspace #file:.editorconfig
このEditorConfigの規約に従ってUserServiceクラスを作成してください

Claude Code:

.editorconfigファイルの内容を参考に、UserServiceクラスを作成してください

Cursor/Windsurf:

  • チャットで.editorconfigファイルをコンテキストに追加
  • エージェントが自動的にファイルを読み取って適用

この場合、AIエージェントはEditorConfigの内容(命名規則、var使用、中括弧ルール等)を読み取り、それに従ったコードを生成します。ただし、これは開発者が意図的に参照した場合のみで、通常のインライン補完では適用されません。

方法2: AGENTS.md(クロスツール標準)

AGENTS.mdは、AIコーディングエージェント向けの標準規格として提案されています。EditorConfigと同様に、クロスツール互換性を目指しています。

# AGENTS.md
## C# Coding Guidelines

When generating C# code, follow these conventions:
- Private fields: Use `_` prefix with camelCase
- `var`: Use only when type is apparent
- `using`: Place outside namespace
- Braces: Always required (no omission)

メリット:

  • ✅ GitHub上で20,000以上のリポジトリで採用
  • ✅ Copilot、Cursor、Windsurf、Cline等で互換性
  • ✅ プロジェクトルートに1ファイルのみ
  • ✅ 標準規格として推奨(https://agent-rules.org/)

方法3: ツール固有の設定ファイル

各ツールは独自の設定ファイルもサポートしています:

ツール 設定ファイル パス
GitHub Copilot copilot-instructions.md .github/copilot-instructions.md
Claude Code CLAUDE.md プロジェクトルート
JetBrains Junie guidelines.md .junie/guidelines.md

推奨アプローチ:

  1. 基本: .editorconfigをメイン設定として使用(IDE整形で確実)
  2. 応用: AGENTS.mdでAIエージェント向けガイドラインを追加
  3. 特定ツール: 必要に応じてツール固有ファイルを併用

ただし、.editorconfigを明示的に参照する方が、設定ファイルの二重管理を避けられるため最も推奨されます。

Visual Studioの整形機能

Visual StudioでEditorConfig設定を適用する方法:

  • 保存時の自動フォーマット: ツール → オプション → コードクリーンアップ → 「保存時に自動実行する」
  • コードのクリーンアップ: Ctrl + K, Ctrl + E
  • ドキュメントのフォーマット: Ctrl + K, Ctrl + D

コードクリーンアッププロファイルの設定(重要)

warningerrorレベルの設定を自動修正するには、コードクリーンアッププロファイルに「EditorConfig で設定されたすべての警告とエラーを修正」を追加する必要があります。

設定手順:

  1. ツール → オプション → テキストエディター → C# → コードクリーンアップ
  2. 「コードクリーンアップの構成」を開く
  3. 「使用可能な修正ツール」から「EditorConfig で設定されたすべての警告とエラーを修正」を選択
  4. ↓ボタンで「含まれる修正ツール」に移動
  5. 「保存時にコードクリーンアッププロファイルを実行」にチェック

コードクリーンアップの構成ダイアログ
Visual Studioのコードクリーンアップ構成画面

ポイント:

  • suggestionレベルは「警告とエラーを修正」の対象外(自動修正されない)
  • warning/errorレベルは、この設定により保存時やコードクリーンアップ時に自動修正される
  • 検証用サンプルプロジェクト: samples/EditorConfigTest

AI駆動開発での動作フロー

この図から分かるように、.editorconfigの効果は「AI → IDE → 整形」という流れで発揮されます。

AIエージェントとEditorConfigの役割分担

主体 役割 EditorConfig参照 備考
AIエージェント(通常) コード生成・提案 ❌ 自動参照しない 既存コードから推測
AIエージェント(明示的参照) コード生成・提案 ✅ 参照可能 #fileや直接指示で参照
AIエージェント(AGENTS.md) コード生成・提案 ✅ 自動参照 クロスツール標準設定
IDE(Visual Studio) 整形・フォーマット ✅ 自動読み取り 保存時/手動整形で適用

つまり、.editorconfigの活用には3つのレベルがあります:

Level 1: IDE経由の自動整形(基本)

  • AIエージェントは.editorconfigを参照しない
  • IDE側の保存時フォーマットで整形
  • 確実で推奨される方法

Level 2: AIエージェント設定(応用)

方法A: AGENTS.md(推奨)

  • クロスツール標準(Copilot、Cursor、Windsurf等で互換)
  • プロジェクトルートに配置で自動適用
  • GitHub上で20,000+リポジトリで採用

方法B: 明示的参照

  • プロンプトで.editorconfigを明示的に参照
  • AIが生成時点で規約に従う

方法C: ツール固有ファイル

  • copilot-instructions.mdCLAUDE.md

Level 3: 多層防御(最も品質が高い)

  1. AGENTS.md or 明示的参照 → AI生成時に規約適用
  2. IDE自動整形 → 保存時に最終チェック
  3. CI/CDビルド → /warnaserrorで厳格チェック

この理解が重要な理由:

  • 「.editorconfigを置くだけ」ではAIエージェントは自動的に従わない
  • 保存時フォーマットやコードクリーンアップの設定が必須
  • AGENTS.mdや明示的参照を活用すれば、生成時点で規約に従ったコードを得られる
  • 複数の防御層を組み合わせることで、最も高い品質を実現

Visual Studioでの実践 - プロジェクトへの導入手順

EditorConfigの基本を理解したところで、実際にVisual Studioで使ってみましょう。ここでは、すぐに使える実践的な導入手順を説明します。

新規プロジェクトの場合

方法1: プロジェクト作成時に追加

Visual Studio 2022では、新規プロジェクト作成時に.editorconfigを自動追加できます。

  1. ファイル → 新規作成 → プロジェクト
  2. プロジェクトテンプレートを選択(例: ASP.NET Core Web API)
  3. 追加情報画面で、詳細設定を確認
  4. (Visual Studio 2022の場合、デフォルトで.editorconfigが含まれる場合があります)

方法2: 既存プロジェクトに手動追加

  1. ソリューションエクスプローラーでソリューションまたはプロジェクトを右クリック
  2. 追加 → 新しい項目
  3. 検索ボックスに「editorconfig」と入力
  4. editorconfig ファイル(既定値)を選択
  5. 追加をクリック

Visual Studioの設定から.editorconfigを生成

Visual Studioの現在のコードスタイル設定を.editorconfigとして出力できます。

  1. ツール → オプション
  2. テキストエディター → C# → コードスタイル
  3. 各設定項目を希望の値に変更
  4. 設定から .editorconfig ファイルを生成ボタンをクリック
  5. 保存場所を選択(通常はソリューションルート)

コードスタイル設定画面:

Visual Studioコードスタイル設定
Visual Studioのコードスタイル設定画面

命名規則スタイル設定画面:

Visual Studio命名規則設定
Visual Studioの命名規則設定画面

アナライザー設定画面:

Visual Studioアナライザー設定
Visual Studioのアナライザー設定画面

推奨設定テンプレート(C#特化版)

よく使う設定の抜粋版

プロジェクトでよく使われる設定を抜粋した実用的なテンプレートです。この設定から始めて、必要に応じて追加・調整してください。

# トップレベル .editorconfig
root = true

# すべてのファイル
[*]
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true

# C#ファイル
[*.cs]
#### コアEditorConfig オプション ####
indent_style = space
indent_size = 4
end_of_line = crlf

#### .NET コーディング規則 ####
# using の整理
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = true

# this. の設定
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning

# 言語キーワード vs BCL 型
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning

# 修飾子の設定
dotnet_style_require_accessibility_modifiers = always:warning

#### C# コーディング規則 ####
# var 設定
csharp_style_var_elsewhere = false:suggestion
csharp_style_var_for_built_in_types = false:suggestion
csharp_style_var_when_type_is_apparent = false:suggestion

# コードブロックの設定
csharp_prefer_braces = true:warning
csharp_prefer_simple_using_statement = true:suggestion

# 'using' ディレクティブの設定
csharp_using_directive_placement = outside_namespace:error

#### C# 書式ルール ####
# 改行設定
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_open_brace = all

# インデント設定
csharp_indent_block_contents = true
csharp_indent_braces = false

# スペース設定
csharp_space_after_comma = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_call_name_and_opening_parenthesis = false

#### 命名スタイル ####
# 命名ルール
dotnet_naming_rule.interface_should_be_begins_with_i.severity = error
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = error
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.private_field_should_be_begins_with__.severity = error
dotnet_naming_rule.private_field_should_be_begins_with__.symbols = private_field
dotnet_naming_rule.private_field_should_be_begins_with__.style = begins_with__

# 記号仕様
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected

dotnet_naming_symbols.private_field.applicable_kinds = field
dotnet_naming_symbols.private_field.applicable_accessibilities = private

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected

# 命名スタイル
dotnet_naming_style.pascal_case.capitalization = pascal_case

dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.capitalization = pascal_case

dotnet_naming_style.begins_with__.required_prefix = _
dotnet_naming_style.begins_with__.capitalization = camel_case
Microsoft公式推奨設定の完全版を表示(約200行)

上記の抜粋版で足りない場合は、Microsoft公式推奨設定の完全版を参照してください。すべての設定項目を含む完全版は、.NET のコード スタイル規則オプション | Microsoft Learn で確認できます。

Visual Studioの設定から.editorconfigを生成する方法:

  1. ツール → オプション → テキストエディター → C# → コードスタイル
  2. 各設定項目を希望の値に変更
  3. 設定から .editorconfig ファイルを生成ボタンをクリック

実用的なカスタマイズ例

プロジェクトの性質に応じて調整した設定例です。

Modern C# スタイル(C# 10+)

[*.cs]
# ファイルスコープ名前空間を優先
csharp_style_namespace_declarations = file_scoped:warning

# レコード型の優先
dotnet_diagnostic.IDE0090.severity = suggestion

# グローバルusingの整理
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false

# 最新のnullable参照型設定
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
csharp_style_prefer_null_check_over_type_check = true:suggestion

実際のプロジェクト設定例

Blazor Radzenプロジェクトの設定例

Blazor Radzenプロジェクトでは、コンポーネントベースの開発に適した設定が有効です。

[*.cs]
# ファイルスコープ名前空間を優先(Blazorコンポーネントで有効)
csharp_style_namespace_declarations = file_scoped:warning

# 式形式メンバーを推奨(プロパティの簡潔な記述)
csharp_style_expression_bodied_properties = true:suggestion

# 命名規則: privateフィールドは _camelCase
dotnet_naming_rule.private_fields_with_underscore.severity = warning
dotnet_naming_rule.private_fields_with_underscore.symbols = private_fields
dotnet_naming_rule.private_fields_with_underscore.style = prefix_underscore

dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private

dotnet_naming_style.prefix_underscore.required_prefix = _
dotnet_naming_style.prefix_underscore.capitalization = camel_case

Web APIプロジェクトの設定例

ASP.NET Core Web APIプロジェクトでは、コントローラーとサービスの命名規則を厳格にします。

[*.cs]
# usingはnamespace外に配置(必須)
csharp_using_directive_placement = outside_namespace:error

# インターフェースは I プレフィックス必須
dotnet_naming_rule.interface_should_be_begins_with_i.severity = error
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

# 中括弧は必須(可読性のため)
csharp_prefer_braces = true:warning

# varの使用は型が明らかな場合のみ
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:suggestion

クラスライブラリの設定例

再利用可能なクラスライブラリでは、より厳格な設定が推奨されます。

[*.cs]
# アクセシビリティ修飾子は必須
dotnet_style_require_accessibility_modifiers = always:error

# 命名規則: すべての型とメンバーはPascalCase
dotnet_naming_rule.types_should_be_pascal_case.severity = error
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = error

# 不要なusingは警告
dotnet_diagnostic.IDE0005.severity = warning

# フォーマット違反は警告
dotnet_diagnostic.IDE0055.severity = warning

既存C#プロジェクトへの導入戦略

新規プロジェクトでの導入方法を確認しましたが、既存プロジェクトへの導入には特別な配慮が必要です。ここでは、段階的な導入戦略を説明します。

よくある懸念点

既存プロジェクトに.editorconfigを導入する際、次のような懸念が出ることがあります。

1. 既存コードに大量の差分が発生する

数万行のコードベースに.editorconfigを適用すると、すべてのファイルが変更されてしまいます。

懸念:

  • プルリクエストのレビューが困難
  • git blameが使えなくなる
  • マージコンフリクトが多発

2. レガシーなASP.NET Frameworkプロジェクトとの共存

古いプロジェクトと新しいプロジェクトが混在している場合、統一が難しいことがあります。

懸念:

  • 旧コードを全修正するリソースがない
  • 部分的に適用するとかえって混乱する

3. チーム内の抵抗感

「今まで問題なかったのに、なぜ変える必要があるのか」という声が出ることがあります。

懸念:

  • 学習コスト
  • 慣れ親しんだスタイルの変更
  • 「余計な仕事が増える」という反発

段階的導入のベストプラクティス

これらの懸念を解消するため、段階的に導入します。

Phase 内容 重大度 期間 既存コードへの対応
Phase 1 基本設定(インデント、改行、文字コード) warning 1-2週間 修正しない
Phase 2 命名規則(_プレフィックス、Iプレフィックス) warning チーム合意後 触った箇所のみ修正
Phase 3 コードスタイル(var、using配置、中括弧) suggestion/warning 継続 触った箇所のみ修正
Phase 4 厳格化(ビルドエラー化) error 1-2ヶ月後 一括整形実施

導入時のチーム合意形成

ステップ1: 設定内容のレビュー

  • 設定内容をチーム全体で確認
  • 「なぜこの設定にするのか」を議論
  • 既存コードへの影響を説明

ステップ2: トライアル期間(1-2週間)

  • Phase 1の基本設定のみ適用(severity = warning以下)
  • フィードバックを収集し、必要に応じて調整

CI/CDでの段階的強化

Azure DevOpsやGitHub Actionsで、段階的にチェックを厳格化します。

# .github/workflows/build.yml
- name: Build with strict EditorConfig check
  run: dotnet build --configuration Release /warnaserror

段階的な適用:

  • Phase 1-2: 警告のみ表示(ビルド成功)
  • Phase 3: プルリクエストのみ /warnaserror で厳格化
  • Phase 4: 全ブランチで警告をエラー化

導入時のトラブルシューティング

大量差分対策

Git blame無視設定:

一括整形コミットをgit blameから除外します。

  1. プロジェクトルートに .git-blame-ignore-revs ファイルを作成
  2. Gitに設定を追加: git config blame.ignoreRevsFile .git-blame-ignore-revs
  3. チーム全員に共有

一括整形の実行:

Phase 4で全体リフォーマットを行う際は、dotnet formatコマンドを使用します。

# .editorconfigに従って自動整形
dotnet format

プルリクエスト戦略:

大量差分のPRをレビューしやすくするため、コミットを分割します:

  • 基本整形(インデント、改行)
  • using整理
  • 命名規則修正

空白差分の除外確認: git diff --ignore-all-space main...feature/editorconfig

よくある質問(FAQ)

Q1: AIツール(Copilot/Claude Code)はEditorConfigを直接参照しますか?

A: 自動的には参照しませんが、明示的に指定すれば参照できます。

通常のインライン補完では、AIエージェントは.editorconfigを自動的に読み取りません。既存のコードパターンから間接的にスタイルを推測します。

明示的に参照する方法:

  • GitHub Copilot(Agent Mode): @workspace #file:.editorconfig でファイルを参照
  • Claude Code: プロンプトで.editorconfigファイルを明示的に指定
  • AGENTS.md: プロジェクトルートに配置で自動参照(推奨)

詳細は「AIとEditorConfigの実践的な関係」セクションを参照してください。

Q2: StyleCop/FxCopとEditorConfigの違いは?

A:

  • EditorConfig: コードスタイル(整形、命名規則)に特化
  • StyleCop: より厳格なコーディング規約チェック
  • FxCop/Roslyn Analyzer: コード品質・設計の分析

推奨:

  • EditorConfigを基本として導入
  • 必要に応じてStyleCopやカスタムAnalyzerを追加

EditorConfigはRoslynアナライザーと連携するため、組み合わせて使うのがベストです。

Q3: 重大度(severity)をerrorにすれば、AIが生成するコード自体が変わりますか?

A: いいえ、AIの生成動作自体は変わりません。

重大度レベル(silentsuggestionwarningerror)は、IDE側の動作を制御するものです:

  • AI生成時: どの重大度でも、AIは.editorconfigを直接参照しません
  • IDE整形時: すべての重大度レベルで、Visual Studioのコード生成機能はEditorConfigスタイルに従います
  • ビルド時: errorに設定すると、規約違反でコンパイルエラーになります

つまり、重大度の違いは:

  • silent: 視覚的な警告なし、コードクリーンアップには参加しない(個別にクイックアクションから適用可能)
  • suggestion: 灰色点線で提案、コードクリーンアップには参加しない
  • warning: 緑波線、ビルド成功、コードクリーンアッププロファイル設定により自動修正可能
  • error: 赤波線、ビルド失敗、コードクリーンアッププロファイル設定により自動修正可能

AIの出力は変わらず、IDE側のチェックの厳格度が変わる、という理解が正しいです。

Q4: VS Codeでも使える?

A:

基本的なEditorConfig機能(インデント、改行等)は使えますが、本記事で解説したビルドエラー化(Roslyn連携)はVisual Studio限定です。

VS CodeでC#開発する場合:

  • EditorConfigの基本設定は有効
  • C# Dev Kitを導入すれば一部のRoslyn機能が利用可能
  • ただし、Visual Studioほどの統合度はない

Q5: .NET FrameworkとASP.NET Frameworkでも使える?

A:

はい、使えます。ただし制限と追加設定があります:

使用可能な機能:

  • 基本フォーマット(インデント、改行等)
  • 命名規則
  • using配置

制限事項:

  • 最新C#構文(レコード型、ファイルスコープ名前空間等)は使用不可
  • Visual Studioバージョン:2017以降が必要

追加設定が必要:

.NET Framework 4.xプロジェクトでEditorConfigのコード分析を有効にするには、プロジェクトファイル(.csproj)に以下の設定を追加する必要があります:

<PropertyGroup>
  <EnableNETAnalyzers>true</EnableNETAnalyzers>
</PropertyGroup>

この設定により、Roslynアナライザーが有効化され、EditorConfigのコードスタイルルールがビルド時に適用されます。

レガシープロジェクトでも、これらの設定で段階的導入により十分な効果が得られます。

Q6: 複数の.editorconfigファイルを階層的に配置できる?

A:

はい、可能です。.editorconfigは階層的に適用されます。

solution/
├── .editorconfig          # ソリューション全体の設定
├── WebApp/
│   ├── .editorconfig      # WebApp固有の設定(上書き)
│   └── Controllers/
└── ClassLibrary/
    └── .editorconfig      # ClassLibrary固有の設定

下位階層の設定が上位を上書きします。最上位のファイルには root = true を指定して検索を停止させます。

これにより、プロジェクトごとに異なるルールを適用できます。例えば、テストプロジェクトでは命名規則を緩和するなどの運用が可能です。

まとめ

.editorconfigは、AI時代のC#開発における有用なツールです。本記事で解説した要点:

  • AI生成コードをプロジェクト規約に従わせる(コードクリーンアッププロファイル設定により自動修正可能)
  • コードレビューの効率化(スタイル指摘がゼロになる)
  • チーム全体のスタイル統一(新メンバーも規約に従える)
  • ビルドエラー化で品質担保(Visual StudioのRoslyn連携による強制力)

AI駆動開発において、.editorconfigはコード品質を自動的に担保するツールです。新規プロジェクトでは推奨設定テンプレートから始め、既存プロジェクトでは段階的導入戦略に従って、チーム合意を得ながら導入していきましょう。

参考リンク

GitHubで編集を提案
Nexta Tech Blog
Nexta Tech Blog

Discussion