カテゴリ: C# 更新日: 2026/05/11

C#のラムダ式でキャプチャ変数を使う方法を完全解説!初心者でもわかるクロージャー入門

C#のラムダ式でキャプチャ変数を使う方法(クロージャー)
C#のラムダ式でキャプチャ変数を使う方法(クロージャー)

先生と生徒の会話形式で理解しよう

生徒

「C#のラムダ式って、外にある変数をそのまま使えることがあるって聞いたんですが、本当ですか?」

先生

「はい。本当です。ラムダ式は、外側で作った変数を中から使うことができます。」

生徒

「それって、普通のメソッドと何が違うんですか?」

先生

「その仕組みをキャプチャ変数、そしてクロージャーと呼びます。今日はそこを、超やさしく説明していきますよ。」

1. キャプチャ変数とは何か?

1. キャプチャ変数とは何か?
1. キャプチャ変数とは何か?

C#のラムダ式では、ラムダ式の外で作られた変数を、そのまま中で使うことができます。このときに使われる外側の変数を、キャプチャ変数と呼びます。

難しく聞こえますが、イメージはとても簡単です。自分のカバンに入れて持ち歩くメモのようなものだと考えてください。ラムダ式は、そのメモをいつでも取り出して使えるのです。

プログラミング未経験の方は、「外にある変数を中で使う」と聞くと不思議に感じるかもしれません。しかし、C#ではこれが正式にサポートされており、多くの場面で使われています。

2. シンプルなキャプチャ変数の例

2. シンプルなキャプチャ変数の例
2. シンプルなキャプチャ変数の例

まずは、できるだけ単純な例を見てみましょう。ここでは、数値を保存する変数をラムダ式の中で使っています。


int number = 10;

Func<int, int> addNumber = x => x + number;

int result = addNumber(5);
Console.WriteLine(result);

この例では、numberという変数をラムダ式の外で作っています。そして、ラムダ式の中でそのまま使っています。


15

ここでのポイントは、ラムダ式がnumberの値を覚えているということです。これがキャプチャ変数の基本的な考え方です。

3. クロージャーとは何か?

3. クロージャーとは何か?
3. クロージャーとは何か?

クロージャーとは、「キャプチャ変数を保持したまま動作する仕組み」のことです。つまり、ラムダ式とキャプチャ変数がセットになった状態を指します。

難しい言葉ですが、考え方はシンプルです。ラムダ式は、作られた瞬間の周囲の情報を一緒に閉じ込めて動くのです。

そのため、ラムダ式が実行されるタイミングが後になっても、キャプチャした変数はちゃんと使えます。

4. 値が変わるキャプチャ変数の挙動

4. 値が変わるキャプチャ変数の挙動
4. 値が変わるキャプチャ変数の挙動

キャプチャ変数で初心者が混乱しやすいポイントが、「変数の値が変わる」ことです。実際の例を見てみましょう。


int count = 0;

Action increment = () =>
{
    count++;
    Console.WriteLine(count);
};

increment();
increment();
increment();

1
2
3

ラムダ式は、count値そのものを覚えています。そのため、実行するたびに値が増えていきます。

これは「その時の数字をコピーしている」のではなく、「同じ変数を参照している」から起こる動きです。

5. なぜクロージャーが便利なのか

5. なぜクロージャーが便利なのか
5. なぜクロージャーが便利なのか

クロージャーを使うことで、状態を持った処理を簡単に作ることができます。クラスを作らなくても、ちょっとした記憶を持つ処理が書けるのです。

例えば、カウンター、設定値を覚える処理、一時的な計算ルールなどに向いています。初心者のうちは、「外の変数を覚えて動ける仕組みがある」と理解しておけば十分です。

6. キャプチャ変数を使うときの注意点

6. キャプチャ変数を使うときの注意点
6. キャプチャ変数を使うときの注意点

便利なキャプチャ変数ですが、使いすぎると動きが分かりにくくなることがあります。特に、変数の値がどこで変わっているのか分からなくなりやすいです。

初心者のうちは、「必要なときだけ使う」「短い処理で使う」ことを意識すると、コードが読みやすくなります。

7. まとめるとどういう仕組み?

7. まとめるとどういう仕組み?
7. まとめるとどういう仕組み?

C#のラムダ式では、外側の変数をそのまま使うことができます。その変数をキャプチャ変数と呼び、その仕組み全体をクロージャーと呼びます。

難しい言葉に見えますが、「ラムダ式が周りの情報を覚えて動く仕組み」と考えれば、十分に理解できます。ここまで分かれば、C#のラムダ式の理解は一段階レベルアップしています。

まとめ

まとめ
まとめ

今回は、C#のラムダ式におけるキャプチャ変数とクロージャーについて、基礎から丁寧に解説してきました。C#初心者の方にとっては、「ラムダ式の外にある変数を中で使える」という仕組みは最初は少し不思議に感じるかもしれません。しかし、この仕組みこそがキャプチャ変数であり、さらにその動作全体をクロージャーと呼ぶということが理解できたのではないでしょうか。 C#のラムダ式は、単なる短い関数のように見えて、実は非常に強力な機能を持っています。特に、外側の変数を保持したまま処理を行えるという特徴は、状態を持つ処理や、繰り返し使うロジックの簡略化に大きく役立ちます。たとえば、カウンター処理やフィルタ処理、イベント処理など、さまざまな場面で活用できます。 また、キャプチャ変数は「値のコピー」ではなく「変数そのものを参照する」という点も重要です。この違いを理解していないと、値が変化する動きに戸惑ってしまうことがあります。実際にコードを書いて動かしてみることで、この挙動は自然と理解できるようになります。 初心者の方は、まずはシンプルな例から始めて、徐々に複雑な使い方に慣れていくことが大切です。特に、変数のスコープやライフタイムを意識することで、より安全で読みやすいコードを書くことができるようになります。ラムダ式とクロージャーの理解は、C#だけでなく他のプログラミング言語にも応用できる重要な知識です。 さらに、実務の現場ではLINQと組み合わせて使われることが多く、データ処理やコレクション操作を簡潔に書くためにも欠かせない技術です。キャプチャ変数を正しく理解しておくことで、バグを防ぎつつ効率的な開発ができるようになります。 以下に、今回学んだ内容を復習するためのサンプルコードをまとめます。ラムダ式とキャプチャ変数の基本をしっかりと確認しておきましょう。


int total = 0;

Func<int, int> addToTotal = x =>
{
    total += x;
    return total;
};

Console.WriteLine(addToTotal(5));
Console.WriteLine(addToTotal(10));
Console.WriteLine(addToTotal(3));

5
15
18

このように、ラムダ式は外側の変数を保持し続けるため、処理を繰り返すごとに値が変化していきます。これがクロージャーの特徴です。クラスを使わなくても状態を持つ処理を実現できる点は、非常に便利です。 ただし、複雑な処理で多くのキャプチャ変数を使うと、コードの可読性が下がることがあります。そのため、必要最小限にとどめることや、処理を小さく分割することが重要です。 今回の内容をしっかり理解することで、C#のラムダ式の使い方が一段とレベルアップし、より実践的なコードが書けるようになります。プログラミング初心者の方も、ぜひ何度も読み返して理解を深めてみてください。

先生と生徒の振り返り会話

生徒

ラムダ式で外の変数が使えるっていうのは分かってきたんですが、それがキャプチャ変数なんですね。

先生

その通りです。ラムダ式の外で定義された変数を中で使うとき、その変数をキャプチャ変数と呼びます。

生徒

そして、その仕組み全体がクロージャーということですか。

先生

はい。ラムダ式とキャプチャ変数がセットになって動く仕組みをクロージャーと呼びます。

生徒

値が変わっていくのはコピーじゃなくて同じ変数を使っているからなんですね。

先生

よく理解できていますね。そこがとても大事なポイントです。

生徒

実際にカウンターみたいな処理が簡単に作れるのは便利だと思いました。

先生

その通りです。状態を持つ処理を簡単に書けるのがクロージャーの強みです。

生徒

でも使いすぎると分かりにくくなるんですよね。

先生

はい。だからこそ、必要な場面で適切に使うことが大切です。

生徒

これからはラムダ式を書くときに意識してみます。

先生

それが良いですね。繰り返し使っていくことで、自然と身についていきますよ。

カテゴリの一覧へ
新着記事
New1
C#
C#のbool型を完全解説!初心者でもわかるtrueとfalseの基本と使い方
New2
C#
C#でバージョン管理を始めよう!Gitを使った基本操作を紹介
New3
C#
C# WPFのスタイルとリソースでデザインを効率化!初心者向け入門ガイド
New4
Azure
Azure Virtual MachinesのIPアドレス管理を徹底解説!パブリックとプライベートの使い分けルール
人気記事
No.1
Java&Spring記事人気No1
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド
No.2
Java&Spring記事人気No2
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.3
Java&Spring記事人気No3
C#
C#のbool型を完全解説!初心者でもわかるtrueとfalseの基本と使い方
No.4
Java&Spring記事人気No4
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.5
Java&Spring記事人気No5
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方
No.6
Java&Spring記事人気No6
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.7
Java&Spring記事人気No7
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.8
Java&Spring記事人気No8
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド