C#入門編 Visual Studio 2026 リファクタリング入門② ~Visual Studioの提案でスッキリ書き換え ~LINQ・パターンマッチング・文字列補間~
Visual Studio編です。前回に引き続き、コードの品質を高める「リファクタリング」について解説します。
前回の記事では、名前の変更(Rename)メソッドの抽出(Extract Method)を学びました。これらは「自分で判断して、コードの構造を改善する」リファクタリングでした。
今回は少しアプローチが変わります。Visual Studioが「こう書けますよ」と提案してくれるコード変換を活用して、コードをスッキリ書き換える方法を紹介します。
以下のような方に役立つ内容となっています。
- C#の新しい書き方(文字列補間、パターンマッチング、LINQなど)を効率よく学びたい方
- 既存のコードをもっと簡潔に書き換えたい方
- Visual Studioにおける電球アイコンやCtrl+.の活用方法を知りたい方
Ctrl+.を押す習慣をつけるだけで、Visual StudioがC#の先生になってくれます!
前回の記事もぜひ参考にしてください。
Ctrl+.で表示されるコード変換とは
前回の記事で、リファクタリング機能の多くはCtrl+.(クイックアクション)から利用できることを紹介しました。
Visual Studioでコードを書いていると、行の左側に以下のような電球・ドライバ・エラー電球のアイコンが表示されることがあります。

これは「このコード、別の(より良い)書き方がありますよ」というVisual Studioからの提案です。提案が表示されたらCtrl+.を押すだけで、変換候補の一覧が表示されます。

ポイントは、自分でC#の新機能を調べなくても、Visual Studioが教えてくれるということです。
Ctrl+.を押す習慣さえあれば、日々のコーディングの中で自然にC#の新しい書き方を学んでいけるというわけですね。
電球・ドライバ・エラー電球アイコンの細かい意味合いはMicrosoft Learnの記事も参考にしてください。
実用上は、これらのアイコンがでたら、Ctrl+.で変換候補を確認してみるぐらいの感じでよいかと思います。
よく使うコード変換
ここからは、よく使うコード変換を5つ紹介します。すべてCtrl+.から実行できます。
(リファクタリング機能一覧についてはMicrosoft Learnの記事も参考にしてください。)
文字列連結 → 文字列補間($””)
最初に紹介するのは、効果がすぐに実感できる文字列補間への変換です。
Before: + で連結
string name = "太郎";
int age = 30;
string message = "こんにちは、" + name + "さん!あなたは" + age + "歳です。";After: 文字列補間($””)
string name = "太郎";
int age = 30;
string message = $"こんにちは、{name}さん!あなたは{age}歳です。";以下のように電球アイコンがでたら、Ctrl+.で変換候補がでます。「補間された文字列に変換する」を選びましょう。修正後のプレビュー表示もできます。

変数を + で連結する書き方は、変数が増えるほど読みにくくなります。
文字列補間($"")を使うと、文字列の中に {変数名} を直接埋め込めるので、完成形の文字列がイメージしやすくなります。
文字列補間を含む詳しい文字列操作の方法については、以下の記事も参考にしてください。
マジックナンバー → 定数化(変数の抽出)
次は、コード中に埋め込まれた「意味のわからない数値」に名前を付ける変換です。
Before: マジックナンバー
int age = 23;
if (age >= 18)
{
Console.WriteLine("成人です");
}After: 意味のある名前を付ける
int age = 23;
const int AdultAgeThreshold = 18;
if (age >= AdultAgeThreshold)
{
Console.WriteLine("成人です");
}「ローカル定数を導入します」を選びます。

※実際のコードでは定数はメソッドの先頭やクラスレベルに置くのが一般的です。
コード中に 18 や 100 のような数値がそのまま書かれていると、その数値が何を意味するのかがわかりません。
こうした「マジックナンバー」に名前を付けることで、コードの意図が明確になります。
前回の記事で学んだ「良い名前をつけるとコードが読みやすくなる」っていう考え方だね!
switch文 → switch式
switch文をswitch式(パターンマッチ)に変換する提案も見てみましょう。
Before: switch文
string GetDayType(DayOfWeek day)
{
switch (day)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
return "休日";
default:
return "平日";
}
}After: パターンマッチング(C# 9以降)
string GetDayType(DayOfWeek day)
{
return day switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "休日",
_ => "平日",
};
}「switchステートメントを式に変換します」を選びます。

switch式では、case や return といったキーワードが不要になり、コードが大幅にコンパクトになります。
また、or パターンを使って複数の条件をまとめたり、_(ディスカードパターン)でデフォルトケースを表現したりできます。
for → foreach → LINQ
次は、ループの書き換えです。Visual Studioは段階的に、よりシンプルなコードへの変換を提案してくれます。
Before: forループ
var items = new List<string> { "りんご", "みかん", "ぶどう" };
for (int i = 0; i < items.Count; i++)
{
Console.WriteLine(items[i]);
}After: foreachループ
var items = new List<string> { "りんご", "みかん", "ぶどう" };
foreach (string v in items)
{
Console.WriteLine(v);
}「‘foreach’に変換する」を選びます。反復変数の名前もつけることができます。

さらに、フィルタや変換を含むforeachは、LINQへの変換が提案されることがあります。
Before: foreachでフィルタして新しいリストを作成
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = new List<int>();
foreach (var n in numbers)
{
if (n % 2 == 0)
{
evenNumbers.Add(n);
}
}After: LINQで同じ処理
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = (from n in numbers
where n % 2 == 0
select n).ToList();After: LINQで同じ処理(呼び出し形式)
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();「LINQに変換」もしくは「LINQ(呼び出し形式)へ変換」を選びます。

foreachでは「どうやるか」(ループして、条件判定して、リストに追加して…)を手続き的に書いていました。
LINQでは「何をしたいか」(条件に合う要素の名前を取得したい)を宣言的に記述するため、簡潔でわかりやすくなります。
LINQの詳細は以下の記事も参考にしてください。
var ↔ 明示的な型
最後に紹介するのは、varと明示的な型の変換です。
明示的な型 → var
List<string> names = new List<string>();
↓
var names = new List<string>();「暗黙的な型の使用」を選びます。

var → 明示的な型(逆変換も可能)
var count = 10;
↓
int count = 10;「‘var’ではなく明示的な型を使用します」を選びます。

この変換は、前の4つとは少し性質が異なります。「どちらが正解」というものではなく、チームのコーディング規約や好みによって使い分けるものです。
一例として以下のような考え方があります。
- 右辺から型が明らかな場合は
var:var names = new List<string>();
—new List<string>()と書いてあるので型は明らか - 右辺から型がわからない場合は明示的な型:
int count = GetItemCount();
— メソッドの戻り値だけでは型がわかりにくい
変換の提案が出たら、とりあえず試してみればいいんだね!
そうですね。C#のより良い書き方、モダンな書き方の勉強になると思いますよ!
以下のように「new(…)を簡素化(型を省く)する」という変換もあります。
List<string> names = new List<string>();
↓
List<string> names = new();Visual Studioを活用したより発展的なリファクタリング
AIを活用したリファクタリング
Visual Studio 2026には、GitHub CopilotによるAIを活用してリファクタリングを行ってもらうことも可能です。
従来のCtrl+.によるリファクタリングが「決まったパターンの変換」(ルールベース)ですが、AIリファクタリングは「コードの文脈を理解した柔軟な提案」が可能です。
GitHub Copilotの活用方法については以下の記事を参考にしてください。
うまく活用すると、複数ファイルにまたがったり、アーキテクチャレベルのかなり大規模なリファクタリングも可能となります。
ただし、AIの提案は必ずしも正しいとは限りません。従来のCtrl+.リファクタリングは、言語仕様に基づいた確実な変換を行ってくれます。
安全なリファクタリング
コード変換は便利ですが、安全に行うための習慣も大切です。
- 小さく・こまめに: 一度に大きく変えず、1つの変換ごとに動作確認をしましょう。
- プレビューで確認: Ctrl+.で表示される変換候補には、変更箇所のプレビューが表示されるものもあります。適用前に確認する癖をつけましょう。
- ビルド&テスト: リファクタリング後は必ずビルドして動作確認します。自動テストがあれば、さらに安心です。
- Gitでこまめにコミット: 問題があれば戻せるように、リファクタリング前にコミットしておきましょう。
Gitや自動テストについては以下の記事も参考にしてください。
今回メインで紹介したルールベースの「Ctrl+.リファクタリング」は比較的安全です。
AIを使った大規模な自動リファクタリングを行う場合などは、Gitによる版管理・自動テストはほぼ必須でしょう。
まとめ
本記事では、Visual Studioが提案するコード変換機能について解説しました。
Ctrl+.の習慣化 — 電球アイコンが表示されたら確認してみるとよいでしょう。C#の新しい書き方を自然に学んでいくことができます。
よく使うコード変換として、以下の5つを紹介しました。
- 文字列補間($””) — 変数を含む文字列がスッキリ読みやすくなる
- 定数化(マジックナンバー対策) — 数値に意味のある名前を付けて意図を明確にする
- switch式 — 値を返すswitchがコンパクトに書ける(パターンマッチング)
- LINQ — ループ処理を「何をしたいか」で記述できる
- var ↔ 明示的な型 — チームの規約に合わせて使い分ける
Visual Studioでは、このようなルールベースのコード変換に加えて、GitHub Copilotによる高度なリファクタリング支援も可能です。
安全に行うコツとして、小さく・こまめに・確認しながら進めることが大切です。
引き続き、一緒にC#やVisual Studioについて学んでいきましょう!




