Visual Studio編です。前回に引き続き、コードの品質を高める「リファクタリング」について解説します。

前回の記事では、名前の変更(Rename)メソッドの抽出(Extract Method)を学びました。これらは「自分で判断して、コードの構造を改善する」リファクタリングでした。

今回は少しアプローチが変わります。Visual Studioが「こう書けますよ」と提案してくれるコード変換を活用して、コードをスッキリ書き換える方法を紹介します。

以下のような方に役立つ内容となっています。

  • C#の新しい書き方(文字列補間、パターンマッチング、LINQなど)を効率よく学びたい方
  • 既存のコードをもっと簡潔に書き換えたい方
  • Visual Studioにおける電球アイコンやCtrl+.の活用方法を知りたい方
プロ太

Ctrl+.を押す習慣をつけるだけで、Visual StudioがC#の先生になってくれます!

前回の記事もぜひ参考にしてください。

C#入門編 Visual Studio 2026 リファクタリング入門① ~名前変更とメソッド抽出で読みやすいコードへ~ Visual Studio編です。前回に引き続き、コードの品質を高める「リファクタリング」について解説します。 Visual S...

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+.で変換候補がでます。「補間された文字列に変換する」を選びましょう。修正後のプレビュー表示もできます。

変数を + で連結する書き方は、変数が増えるほど読みにくくなります。

文字列補間($""を使うと、文字列の中に {変数名} を直接埋め込めるので、完成形の文字列がイメージしやすくなります。

文字列補間を含む詳しい文字列操作の方法については、以下の記事も参考にしてください。

C#入門編(20)文字列操作マスターガイド ~基本操作・StringBuilderによる高速化・正規表現まで~ C#入門編です。今回は「C#における文字列処理」について解説します。 プログラミングにおいて文字列処理は非常に頻繁に行われる操作...

マジックナンバー → 定数化(変数の抽出)

次は、コード中に埋め込まれた「意味のわからない数値」に名前を付ける変換です。

Before: マジックナンバー

int age = 23;

if (age >= 18)
{
    Console.WriteLine("成人です");
}

After: 意味のある名前を付ける

int age = 23;

const int AdultAgeThreshold = 18;

if (age >= AdultAgeThreshold)
{
    Console.WriteLine("成人です");
}

ローカル定数を導入します」を選びます。

※実際のコードでは定数はメソッドの先頭やクラスレベルに置くのが一般的です。

コード中に 18100 のような数値がそのまま書かれていると、その数値が何を意味するのかがわかりません。

こうした「マジックナンバー」に名前を付けることで、コードの意図が明確になります。

プロ美

前回の記事で学んだ「良い名前をつけるとコードが読みやすくなる」っていう考え方だね!

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式では、casereturn といったキーワードが不要になり、コードが大幅にコンパクトになります。

また、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の詳細は以下の記事も参考にしてください。

C#入門編(16)LINQ ~データ操作を効率的に行う~ C#入門編です。今回は「LINQ (Language Integrated Query)」について解説します。LINQは、C#でデータ...

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の活用方法については以下の記事を参考にしてください。

Visual StudioでGitHub Copilot入門!~C#初心者のためのAIコーディング支援ガイド~ AI活用編です。プログラミング学習において、GitHub Copilotなどのコード補完AIツールは非常に強力な味方となります。 ...
Visual StudioでGitHub Copilot入門!~チャット機能「質問(Ask)」モードを使いこなす!~ 【VS2022、VS2026】 AI活用編です。プログラミングにおいて、GitHub Copilotは非常に強力な味方となります。 今回、GitHub Copi...
Visual StudioでGitHub Copilotで「AIエージェント」入門!初心者向け解説【VS2022、VS2026】 AI活用編です。GitHub Copilotのエージェント(Agent)モードは、複数ファイルの横断修正やビルド・テスト実行まで自律的...

うまく活用すると、複数ファイルにまたがったり、アーキテクチャレベルのかなり大規模なリファクタリングも可能となります。

ただし、AIの提案は必ずしも正しいとは限りません。従来のCtrl+.リファクタリングは、言語仕様に基づいた確実な変換を行ってくれます。

安全なリファクタリング

コード変換は便利ですが、安全に行うための習慣も大切です。

  • 小さく・こまめに: 一度に大きく変えず、1つの変換ごとに動作確認をしましょう。
  • プレビューで確認: Ctrl+.で表示される変換候補には、変更箇所のプレビューが表示されるものもあります。適用前に確認する癖をつけましょう。
  • ビルド&テスト: リファクタリング後は必ずビルドして動作確認します。自動テストがあれば、さらに安心です。
  • Gitでこまめにコミット: 問題があれば戻せるように、リファクタリング前にコミットしておきましょう。

Gitや自動テストについては以下の記事も参考にしてください。

【C#、Blazor】Webアプリ開発入門編(3)Gitでバージョン管理 ~Gitの基本的な使い方を学ぶ~【ASP.NET Core】 Blazor編です。今回はWebアプリ開発を効率よく行う上で不可欠となる「バージョン管理ツールGit」について紹介します。 本記...
C#入門編(27)自動テスト入門 ~xUnitで「壊れたら気づける」仕組みを作る~ C#入門編です。今回はC#における自動テストについて解説します。 「コードを変更するたびに、手動で動作確認するのが大変…」「いつ...
プロ太

今回メインで紹介したルールベースの「Ctrl+.リファクタリング」は比較的安全です。

AIを使った大規模な自動リファクタリングを行う場合などは、Gitによる版管理・自動テストはほぼ必須でしょう。

まとめ

本記事では、Visual Studioが提案するコード変換機能について解説しました。

Ctrl+.の習慣化 — 電球アイコンが表示されたら確認してみるとよいでしょう。C#の新しい書き方を自然に学んでいくことができます。

よく使うコード変換として、以下の5つを紹介しました。

  • 文字列補間($””) — 変数を含む文字列がスッキリ読みやすくなる
  • 定数化(マジックナンバー対策) — 数値に意味のある名前を付けて意図を明確にする
  • switch式 — 値を返すswitchがコンパクトに書ける(パターンマッチング)
  • LINQ — ループ処理を「何をしたいか」で記述できる
  • var ↔ 明示的な型 — チームの規約に合わせて使い分ける

Visual Studioでは、このようなルールベースのコード変換に加えて、GitHub Copilotによる高度なリファクタリング支援も可能です。

安全に行うコツとして、小さく・こまめに・確認しながら進めることが大切です。

プロ太

引き続き、一緒にC#やVisual Studioについて学んでいきましょう!