本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第4章 ジェネリクスとデリゲート · レッスン32

クロージャ

ブラウザで完結

導入

ラムダ式は、自分の外にある変数を「覚えて」使えます。これをクロージャと呼びます。設定値を閉じ込めた専用の処理を作る、といった強力な使い方ができます。

図解

flowchart LR
    OUT["外の変数 rate = 0.1"] -.->|捕まえる(キャプチャ)| L["ラムダ price => price * rate"]
    L --> F["rate を覚えた専用関数"]

サンプル

// 外の変数 taxRate を「覚えた」関数を作って返す
Func<int, int> MakeTaxCalculator(double taxRate)
{
    // このラムダは taxRate をキャプチャ(記憶)する
    return price => (int)(price * (1 + taxRate));
}

var withTax10 = MakeTaxCalculator(0.10);
var withTax8 = MakeTaxCalculator(0.08);

Console.WriteLine(withTax10(1000));   // 1100(10%を覚えている)
Console.WriteLine(withTax8(1000));    // 1080(8%を覚えている)
  • ラムダは外側の変数をキャプチャ(記憶)して後から使える=クロージャ
  • 「設定値を閉じ込めた専用関数」を量産できる
  • 各クロージャは自分がキャプチャした値を独立して保持する

演習

var addFive = MakeAdder(5);
Console.WriteLine(addFive(10));   // 15

// TODO: 「n を足す関数」を返す MakeAdder(int n) を定義してください(クロージャで n を記憶)
___
  • 期待される出力: 15
ヒント1を見る

Func<int, int> MakeAdder(int n) => x => x + n;

ヒント2を見る

返すラムダが引数nを覚えます

まとめ

  • クロージャはラムダが外側の変数を記憶する仕組み
  • 設定値を閉じ込めた専用処理を作れる
  • 各クロージャは捕まえた値を独立して保持する

次回: 変化を通知する仕組み「イベント」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。