本日はAWESOME-COPILOTの技術調査枠です。
AWESOME-COPILOTのドキュメントを読みながら実際に操作を試して記事に残します。
今回はカスタムインストラクションの一つC# Developmentについてです。
C# Development
C# DevelopmentはC#アプリケーション構築のガイドラインです。
このインストラクションファイルはプロジェクトに配置するとAIがコード生成やレビューをする際の共通ルールです。
以下のページからC# Developmentのインストールボタンをクリックして取得します。
github.com
インストールボタンを押してC# Developmentをダウンロードします。
すると.github/instructions配下にインストラクションがインストールされます。

インストールしたインストラクションはCopilotの動作に自動的に適用されます。
このインストラクションを読み込むと Copilot は以下を考慮してコード生成・修正を行います。
- C# コーディング規約
- .NET の設計原則
- 可読性・保守性
- パフォーマンス
- テスト可能性
具体的にはCopilotは以下のような行動をとります。
MicrosoftのC#コーディング規約を遵守
CopilotはC#の公式スタイルガイドに沿ったコードを生成します。
例えば命名規則は以下のルールに従います。
| 要素 | 命名 |
|---|---|
| クラス | PascalCase |
| メソッド | PascalCase |
| フィールド | camelCase |
| 定数 | PascalCase |
例えば以下のようなコードです。
public class UserService { private readonly IUserRepository userRepository; public UserService(IUserRepository repository) { userRepository = repository; } }
SOLID原則を意識した設計
Copilotはコードを書く際に以下のSOLID原則を守るよう提案します。
S — Single Responsibility
クラスは1つの責任だけ持つ
O — Open / Closed
拡張可能で変更不要
L — Liskov substitution
インターフェースで置き換え可能
I — Interface segregation
小さなインターフェース
D — Dependency inversion
DI(依存性注入)を使う
例えば以下のようなコードです。
public interface IUserRepository { Task<User> GetAsync(int id); }
依存性注入(Dependency Injection)
CopilotはDIコンテナを使う設計を推奨します。
例えば以下のようにコンテナを利用します。
builder.Services.AddScoped<IUserService, UserService>();
コンテナは以下の理由で利用します。
- テストしやすい
- モジュール分離
- 保守性向上
async/awaitの正しい使い方
CopilotはC#の非同期処理のベストプラクティスに従います。
例えば以下のようなコードです。
public async Task<User> GetUserAsync(int id) { return await repository.GetAsync(id); }
具体的には以下の推奨事項に従います。
- async/await を使う
- .Result / .Wait() を避ける
- I/O処理は非同期
可読性とクリーンコード
Copilotは以下のようなクリーンコード原則を守るよう提案します。
- 小さなメソッド
- 明確な名前
- 重複排除
例外処理のベストプラクティス
Copilotは安全なエラーハンドリングを提案します。
例えば以下のようなコードです。
try { await service.ProcessAsync(); } catch (Exception ex) { logger.LogError(ex, "Processing failed"); throw; }
以下の推奨事項に従います。
- 例外を握りつぶさない
- ログ出力
- 適切な例外型
テストしやすいコード設計
Copilotは以下の点を考慮したコードを提案します。
- インターフェース利用
- DI
- 小さなメソッド
- Mock可能な設計
例えば以下のようなコードです。
public class OrderService { private readonly IPaymentService paymentService; public OrderService(IPaymentService paymentService) { this.paymentService = paymentService; } }
パフォーマンス最適化
Copilotは以下のようなC#のパフォーマンス面も考慮して提案します。
- 不要なオブジェクト生成を避ける
- Span / Memory 利用
- LINQの過剰使用を避ける