|
|
連載:[完全版]究極のC#プログラミング
Chapter6 ラムダ式(前編)
川俣 晶
2009/10/19 |
 |
|
6.4 キャプチャされる変数
上位スコープにアクセスできるというのは、実はいうほど簡単な話ではない。
次のリスト6.5を見ていただきたい。常識的に考えれば、このプログラムは動作しないはずである。なぜなら、変数messageはCreateMethodメソッドからリターンした瞬間に消滅するが、ラムダ式が呼ばれるのはその後だからである。
using System;
delegate void MyAction();
class Program
{
static MyAction CreateMethod()
{
string message = "Hello! World!";
return ()=>
{
Console.WriteLine(message);
};
}
static void Main(string[] args)
{
MyAction action = CreateMethod();
action(); // 出力:Hello! World!
}
}
|
|
リスト6.5 消滅した変数を参照した例 |
しかし、このプログラムは正常に動作する。なぜかといえば、「外部変数のキャプチャ」という機能が用意されているからだ。
外部変数のキャプチャとは、ラムダ式が上位スコープの変数を参照しているとき、その変数の寿命をラムダ式の寿命が尽きるまで延命する機能である(より正確にいえば、C#言語の仕様であり、仕様には「少なくとも、ラムダ式を参照するデリゲートがガベージコレクションできる状態になるまで延長されます」と記述されている)。
この機能があるため、本来ならメソッドの実行が終わった時点で寿命が尽きたはずの変数messageは、ラムダ式から出力されるときにも生き延びていたのである。
Insider.NET 記事ランキング
本日
月間