ラムダ式は暗黙的に使用される変数を取り込み、クロージャを作成します 。クロージャは、いくつかの状態コンテキストと共に関数です。コンパイラは、ラムダ式がその周囲の文脈からの値を '囲む(enclose)'たびにクロージャを生成する。
例:以下の場合
Func<object, bool> safeApplyFiltererPredicate = o => (o != null) && filterer.Predicate(i);
safeApplyFilterPredicate
は、 filterer
の現在の値へのプライベート参照を持ち、 Invoke
メソッドが次のように動作する、新しく作成されたオブジェクトを参照します
o => (o != null) && filterer.Predicate(i);
safeApplyFilterPredicate
の値の参照が維持されているsafeApplyFilterPredicate
、 safeApplyFilterPredicate
が現在参照しているオブジェクトへの参照が存在するため、これはfilterer
です。これはガベージコレクションに影響し、現在filterer
いるオブジェクトがfilterer
場合に予期しない動作が発生する可能性があります。
一方、クロージャを使用して、他のオブジェクトへの参照を含むビヘイビアをカプセル化するエフェクトを考察することができます。
例えば
var logger = new Logger();
Func<int, int> Add1AndLog = i => {
logger.Log("adding 1 to " + i);
return (i + 1);
};
クローズを使用して状態マシンをモデル化することもできます。
Func<int, int> MyAddingMachine() {
var i = 0;
return x => i += x;
};