はじめに
AI が開発現場に入り込んだ今、私たちは「どの言語で書けば、AI と一緒に生産性を上げられるか」をあらためて考える必要があります。
その問いに対して、私は C# をとても強く推したいです。
理由はシンプルです。C# は、AI が生成するコードの質を人間が早く見抜き、なおかつ安全に運用できるように設計された言語だからです。
AI には、たとえ文法は正しくても、意味が崩れているコードを量産するという特性があります。つまり、今の時代に重要なのは「AI が勝手にコードを書けるか」ではなく、AI が書いたコードをすぐに検証・修正できるかです。
C# はその点で非常に強いです。
- 強い型システムがある
- 静的型付けである
- Roslyn によってコンパイル時に問題を即座に検出できる
-
.editorconfigのようなルールまで、ビルド時の警告・エラーに落とし込める - BCL や標準ライブラリが充実していて、プロダクトの土台をすぐに作れる
この 5 つが揃っていることで、AI 時代における C# は一段上の「安全な実装基盤」になっています。
本記事の結論
C# が AI 時代に向いているのは、生成されるコードの「誤差」を拾う仕組みが非常に優れているからです。
AI は、特に新しいことをたくさん書くとき、見た目はよくても、内部の契約が破れているコードを出しがちです。
たとえば次のようなケースです。
var user = new User { Name = "Alice" };
var age = user.Age + "歳";
これは構文的には成立しますが、Age が int なのに string と足し算しているため、設計としては破綻しています。
この種のミスは、動的型付け言語では実行まで気づきにくいことがあります。一方で C# では、int と string を妙な方式で混ぜるような設計がコンパイル前段階で潰しやすいです。
つまり、AI 時代では「生成したコードが正しいか」よりも、「生成したコードをすぐに安全に検証できるか」が重要です。C# はこの観点で非常に優れています。
1. AI 時代に必要なのは「書く」より「検証できること」
AI との開発では、単にコードをたくさん書けることは重要ではありません。
むしろ重要なのは、生成したコードをすぐに見つけて修正できるかです。
ここで C# が優れているのは、コードを生成した後の品質担保がしやすいことです。
- 変数や引数の型が明確である
- コンパイラが不正なコードを早く指摘する
- IDE がリアルタイムに警告を出す
-
dotnetCLI がビルド・テスト・修正を標準化する -
.editorconfigで規約を自動化できる
この一連の流れが、AI と人間の共同作業を安定させます。
AI には「書く力」はありますが、誤った設計を見抜く力はまだ人間が持つべき部分が大きいです。C# は、その誤りを早く発見しやすい言語として有利です。
2. 強い型システムと静的型付けで曖昧さを潰せる
C# の大きな強みは、型が設計そのものになることです。
型によって、関数の入力や出力、状態の境界、ビジネスルールの前提が明確になります。
public record UserId(Guid Value);
public sealed record User(UserId Id, string Name, int Age);
public sealed class UserService
{
public User GetAdultUser(User user)
{
if (user.Age < 18)
{
throw new InvalidOperationException("成人のみです");
}
return user;
}
}
ここで UserId や User のような型を分けることで、AI が生成したコードの粗さをかなり減らせます。
たとえば Guid をそのまま string と扱ってしまうような実装は、コンパイラや IDE が違和感を出してくれます。
この型の強さは、開発者が「会話としては正しそうだが、実装としては危ない」コードを早く潰せることを意味します。
AI との相性を考えると、ここは極めて重要です。
- 生成 AI は 1 つの変数に対して、意味としては適当な値を代入しがち
- しかし型はその意味の境界を作ってくれる
- そのため、AI の曖昧さを、型で早く制約することができる
静的型付けのメリットは、実行前に失敗させられる点にあります。
const user = { name: "Alice", age: 30 };
console.log(user.age.toUpperCase());
このようなミスは JavaScript では実行時まで持ち越されやすく、開発中に見逃されやすいです。
一方 C# では、int に対して ToUpper() のような不正な使い方をコンパイル時に弾けます。
var user = new User("Alice", 30);
Console.WriteLine(user.Age.ToUpper()); // コンパイルエラー
AI 時代の開発では、生成コードの「動くかどうか」を毎回実行させるよりも、まずコンパイルで潰す方が圧倒的に効率的です。
3. Roslyn が、エディタとコンパイラを一つのフィードバックループにしている
C# の強みは、コンパイラがただ「最後に通るもの」ではないことです。
Roslyn は、C# や Visual Basic のコンパイラと IDE の分析機能が同じ基盤で動く仕組みです。
つまり、IDE の中で次のようなことがその場で起こります。
- 変数が未使用になっている
- null 許容の値を安全に扱っていない
- 返り値の型に不整合がある
-
async/awaitの使い方が誤っている - 例外のハンドリングが不十分
これらが、エディタ上ですぐに通知されます。
Roslyn を前提にしているため、開発者は「ビルドが終わってから気づく」よりも、書きながら修正できます。
この点は AI との対話において非常に大きいです。
AI は「コードを提案する」のが得意ですが、提案を正しい方向に持っていくためのフィードバックループが必要です。Roslyn は、そのループを高速にしてくれます。
たとえば AI が Task.Run(...) を適当に使ったあとに、CancellationToken が不足しているといった指摘がすぐ出る。IDE が即座に見せてくれるので、開発者はすぐ「ここを直して、次を出して」と進められます。
C# は AI に「コードを書かせる」ための言語ではなく、AI が書いたコードを「安定して受け止める」ための言語として優れています。
4. チームのルールを、.editorconfig で自動検査できる
AI との共同開発でもう一つ大きいのが、チームのルールをコードとして固定できることです。
C# では .editorconfig を使うことで、次のようなルールを IDE とビルドの両方に反映できます。
root = true
[*.cs]
indent_style = space
indent_size = 4
dotnet_diagnostic.IDE0060.severity = warning
dotnet_diagnostic.CA1822.severity = error
csharp_style_var_when_type_is_obvious = true
csharp_prefer_simple_using_statement = true
これは「コードスタイルの話」ではなく、チームの設計思想を自動で確認する仕組みです。
次のようなルールを .editorconfig で決められます。
-
varを使うかどうか -
async/awaitの扱い - 未使用の変数を警告にするか
-
new()を使うか - 命名規則を強制するか
- 例外的な例外を禁止するか
このルールがビルド時に検査されると、AI が生成したコードでも、チームの方針に沿っていないコードがそのまま止まるようになります。
開発者にとっては、こういうのが非常に強いです。
- コーディング規約を文書で説明しなくてよい
- ルールを自動化できる
- AI 生成コードにも同じルールがかかる
- 一貫性が保たれやすい
AI が「エンジニアの主観」ではなく、チームのガードレールの中で動くようにするのは、C# ならすごく自然に設計できます。
5. BCL / NuGet / GitHub の資産が、AI の学習と実装を支える
C# は、言語そのものの強さだけでなく、標準ライブラリーの質にも優れています。
System 名前空間の下には、日常的に必要なものが揃っています。
-
System.Text.Jsonで JSON を安全に扱える -
HttpClientで HTTP 通信を簡単に書ける -
Taskとasync/awaitで非同期処理を自然に書ける -
LINQでコレクションを宣言的に扱える -
IEnumerable<T>、Dictionary<TKey, TValue>などのコレクション基盤が整う -
MemoryCacheやChannel<T>など、実務で使う構造が揃っている -
CryptographyやSecurityの機能も組み込みで使いやすい
using System.Text.Json;
var json = JsonSerializer.Serialize(new { name = "Alice", age = 30 });
var user = JsonSerializer.Deserialize<User>(json);
AI との開発では、これはとても大きな意味があります。
なぜなら、AI は「よく使う処理」を自動で書ける一方で、ライブラリの選択や設計のミスをしやすいからです。C# の BCL は、既に慣習に沿った実装の土台が揃っているので、AI が無理に自前実装を作りすぎるリスクを下げてくれます。
しかし BCL だけではありません。C# の実力は、NuGet の豊富さと GitHub 上の大量の OSS コードにも支えられています。
NuGet は、単なるパッケージ管理ではなく、AI が利用する「既存の正解」の発見場所でもあります。
- ASP.NET Core、Entity Framework Core、xUnit、FluentValidation
- Polly、MediatR、Microsoft.Extensions.*
- Serilog、OpenTelemetry など実務向けのパターンが揃っている
こうしたライブラリは、AI がゼロから設計するよりも、既に検証済みの構成を取り込めることが多く、開発者は設計の合意や品質を守りやすくなります。
さらに GitHub には、C# に関するコードが圧倒的に多くあります。OSS の実装例、サンプルアプリ、ライブラリのソース、Issue や PR のやりとり、設計の思想まで、学習材料として使える資産が非常に豊富です。
この環境は AI にとっても大きな利点です。
- 既存の実装を多く見ることで「慣習」を学べる
- ライブラリの使い方が自明になりやすい
- 参考実装が豊富なので、設計の方向性を早く選べる
- 公開コードを見ながら、安全な使い方と危ない使い方を比較しやすい
つまり C# は、書く前に参考になるコードが大量にある言語です。これは AI 時代においてかなり大きな強みです。
6. dotnet CLI とテスト基盤が、実行と検証のループを標準化する
C# の強みは、言語やライブラリだけではありません。dotnet CLI そのものが、AI が生成したコードをすぐに検証し、実行し、改善するための標準インターフェースになっていることです。
たとえば、次のようなコマンドが標準であるという事実は非常に大きいです。
dotnet new webapi
dotnet add package Serilog
dotnet restore
dotnet build
dotnet test
dotnet format
dotnet watch run
これらは、プロジェクトの作成から依存関係の追加、ビルド、テスト、整形、監視までを一貫して扱える仕組みです。
AI との協業では、こうした標準化が効いてきます。
- 生成したコードをすぐ
dotnet buildで確認できる - 依存ライブラリを
dotnet add packageで自然に導入できる - 仕様や境界条件を
dotnet testで検証できる -
dotnet watchで小さな修正を高速に回せる - CI / ローカル / コンテナ環境で同じコマンドを使える
この流れがあると、AI は「何かを書いて終わり」ではなく、実行・検証・修正のループを回しやすくなります。
また、C# はテストの標準基盤も揃っています。
dotnet new xunitdotnet new nunitdotnet new mstestdotnet test
こうした手順が、言語レベルでほぼ標準化されています。
つまり、AI がコードを生成したら、すぐにテストを追加し、dotnet test で検証し、失敗した箇所を修正してまた生成するというサイクルが自然に回ります。
これは、AI 時代にとって非常に重要です。
- 生成コードをすぐ検証できる
- 例外や境界条件を組み込みやすい
- Regression を止めやすい
- 「AI が作った」コードを、チームが安全に管理できる
7. 破壊的変更が少なく、大規模運用でも信頼しやすい
AI 時代において、使っている言語が「新しいものを速く書きやすい」だけでは不十分です。
大切なのは、既存のコードを壊しにくいかという点です。AI が提案したコードを、まずは取り込み、次に改善しながら進める業務では、特にこの観点が重要になります。
C# は、比較的に破壊的変更が少なく、設計の移行がやりやすい言語として知られています。これは、AI と協業するときに特に大きな価値があります。
ここでいう「破壊的変更が少ない」とは、毎年のメジャーアップデートがあっても、実務レベルでは大きく互換性が崩れることが少ないという意味です。たとえば、新しい .NET のランタイムにアップデートしたあと、依存している NuGet パッケージの対応状況を確認し、必要に応じて最小限の調整を入れるだけで、コードがそのまま動くケースが多いです。
さらに重要なのは、.NET のランタイムの品質が非常に高いことです。C# は、Azure や Microsoft 365 のような、世界規模で大量アクセスや複雑な運用を前提にしたサービスでも使われている言語です。通常のアプリケーションでは見えにくいような不具合やトラブルが、実際の大規模運用で何度も報告され、改善されてきたという意味で、「大規模運用で使われている証拠」 は信頼性そのものにつながっています。
この点は、セキュリティ面でも大きな意味があります。NuGet では依存関係管理や脆弱性の確認が整理されており、dotnet list package --vulnerable や dotnet restore と組み合わせた運用が標準的に行えます。こうした仕組みがあることで、AI が生成したコードでも、依存パッケージの脆弱性を一発で確認し、修正の対象にしやすいのです。
C# は、言語仕様と .NET の設計思想が**「後方互換性を重視する」方向に寄っている**ため、AS-IS を維持したまま新しい機能やコードを足していくことがしやすいです。
AI と共同開発する上では、この「壊しにくさ」は重要な要素です。
AI はしばしば、今ある設計の前提を無視して、都合のよい大幅な書き換えを提案しがちです。しかし、実務ではそのような大規模な変更が本当に必要かどうかを、型やコンパイルエラー、設計の影響範囲でやりやすいのが C# の良さです。
C# の世界では、次のような仕組みがリスクを下げてくれます。
- 型の境界が明確である
- コンパイルエラーがすぐ出る
- 実装の変更が影響範囲として目視しやすい
-
Nullableなどのチェックで契約の逸脱が起こりにくい -
.editorconfigや analyzer で設計の違反を防げる - 大規模運用で鍛えられたランタイム品質が支える
- セキュリティ観点で依存パッケージの脆弱性を確認しやすい
つまり、AI が「そのまま書き換えれば便利そう」と思っても、その変更が本当に安全かを型と静的解析で担保しやすいのが C# の強みです。
8. まとめ
AI 時代において、C# が最適な言語の 1 つである理由は、生成コードを安全に扱うための土台が揃っているからです。
- 強い型システムで、設計の境界が明確
- 静的型付けで、実行前に多くのミスを検出できる
- Roslyn で、エディタとコンパイラが一体化している
-
.editorconfigで、チームルールをビルド時の警告やエラーとして徹底できる - BCL、NuGet、GitHub 上のコード資産が、実務的な選択肢を豊富にしている
-
dotnetCLI とテスト基盤が、検証ループを標準化している - 破壊的変更が少なく、大規模運用でも依存しやすい
これらの要素は、「AI がコードを書いた後に人間がどう整えるか」という観点で非常に重要です。
AI は「加速装置」になりますが、加速装置だけでは事故が起きます。
C# は、その事故を早く見つけ、修正し、チームの設計に戻すための土台がすでに整っている言語です。
その意味で、AI 時代における C# は、単なる古い言語ではなく、AI と人間が協業するための堅実な基盤として、今なお非常に価値が高いと言えます。
参考
AI 時代の開発は、コードの量を増やすことではなく、コードの品質と扱いやすさをどう守るかが勝負です。C# は、その観点で非常に頼れる選択肢のひとつです。