C#のラムダ式でキャプチャ変数を使う方法を完全解説!初心者でもわかるクロージャー入門
生徒
「C#のラムダ式って、外にある変数をそのまま使えることがあるって聞いたんですが、本当ですか?」
先生
「はい。本当です。ラムダ式は、外側で作った変数を中から使うことができます。」
生徒
「それって、普通のメソッドと何が違うんですか?」
先生
「その仕組みをキャプチャ変数、そしてクロージャーと呼びます。今日はそこを、超やさしく説明していきますよ。」
1. キャプチャ変数とは何か?
C#のラムダ式では、ラムダ式の外で作られた変数を、そのまま中で使うことができます。このときに使われる外側の変数を、キャプチャ変数と呼びます。
難しく聞こえますが、イメージはとても簡単です。自分のカバンに入れて持ち歩くメモのようなものだと考えてください。ラムダ式は、そのメモをいつでも取り出して使えるのです。
プログラミング未経験の方は、「外にある変数を中で使う」と聞くと不思議に感じるかもしれません。しかし、C#ではこれが正式にサポートされており、多くの場面で使われています。
2. シンプルなキャプチャ変数の例
まずは、できるだけ単純な例を見てみましょう。ここでは、数値を保存する変数をラムダ式の中で使っています。
int number = 10;
Func<int, int> addNumber = x => x + number;
int result = addNumber(5);
Console.WriteLine(result);
この例では、numberという変数をラムダ式の外で作っています。そして、ラムダ式の中でそのまま使っています。
15
ここでのポイントは、ラムダ式がnumberの値を覚えているということです。これがキャプチャ変数の基本的な考え方です。
3. クロージャーとは何か?
クロージャーとは、「キャプチャ変数を保持したまま動作する仕組み」のことです。つまり、ラムダ式とキャプチャ変数がセットになった状態を指します。
難しい言葉ですが、考え方はシンプルです。ラムダ式は、作られた瞬間の周囲の情報を一緒に閉じ込めて動くのです。
そのため、ラムダ式が実行されるタイミングが後になっても、キャプチャした変数はちゃんと使えます。
4. 値が変わるキャプチャ変数の挙動
キャプチャ変数で初心者が混乱しやすいポイントが、「変数の値が変わる」ことです。実際の例を見てみましょう。
int count = 0;
Action increment = () =>
{
count++;
Console.WriteLine(count);
};
increment();
increment();
increment();
1
2
3
ラムダ式は、countの値そのものを覚えています。そのため、実行するたびに値が増えていきます。
これは「その時の数字をコピーしている」のではなく、「同じ変数を参照している」から起こる動きです。
5. なぜクロージャーが便利なのか
クロージャーを使うことで、状態を持った処理を簡単に作ることができます。クラスを作らなくても、ちょっとした記憶を持つ処理が書けるのです。
例えば、カウンター、設定値を覚える処理、一時的な計算ルールなどに向いています。初心者のうちは、「外の変数を覚えて動ける仕組みがある」と理解しておけば十分です。
6. キャプチャ変数を使うときの注意点
便利なキャプチャ変数ですが、使いすぎると動きが分かりにくくなることがあります。特に、変数の値がどこで変わっているのか分からなくなりやすいです。
初心者のうちは、「必要なときだけ使う」「短い処理で使う」ことを意識すると、コードが読みやすくなります。
7. まとめるとどういう仕組み?
C#のラムダ式では、外側の変数をそのまま使うことができます。その変数をキャプチャ変数と呼び、その仕組み全体をクロージャーと呼びます。
難しい言葉に見えますが、「ラムダ式が周りの情報を覚えて動く仕組み」と考えれば、十分に理解できます。ここまで分かれば、C#のラムダ式の理解は一段階レベルアップしています。