今回は、ラムダ式が上位スコープの変数にアクセス出来ることを利用した実用的な例を示します。
Threadクラスは、別スレッドで処理するメソッドをThreadStartデリゲート型で受け取ります。
このThreadStartデリゲートにラムダ式を使用することが出来ます。
以下のコードを御覧ください。
class Program { static void Main(string[] args) { string message = "スレッド内で表示する文字列:"; // 別スレッドで処理するラムダ式 ThreadStart action = () => { for (int i = 0; i < 5; i++) { // 1秒スリープ Thread.Sleep(1000); // Mainメソッドのローカル変数を参照 Console.WriteLine(message + i); } // Mainメソッドの引数を参照 Console.WriteLine("argsの型={0}, argsのレングス={1}", args.ToString(), args.Length); }; // スレッドクラスにThreadStartデリゲート(今回はラムダ式)を渡す Thread thread = new Thread(action); // スレッド開始 thread.Start(); // スレッド終了まで待つ thread.Join(); // <結果> //スレッド内で表示する文字列:0 //スレッド内で表示する文字列:1 //スレッド内で表示する文字列:2 //スレッド内で表示する文字列:3 //スレッド内で表示する文字列:4 //argsの型=System.String[], argsのレングス=0 } }System.Threading名前空間のThreadStartデリゲートは、public delegate void ThreadStart ()と定義されており、これは引数なし、戻り値voidのメソッドのみ指定出来ることを意味しています。
Threadクラスには素直に引数を渡すことが出来ないので、パラメータを渡すのは多少工夫が必要です。
しかし、このThreadStartデリゲートにラムダ式を適用する事で、簡単にスレッド処理側にパラメータを渡すことが可能です。
上記のサンプルコードの例では、ラムダ式actionの中でMainメソッドのローカル変数messageとMainメソッドの引数argsを参照しています。
ラムダ式なら、引数として渡していない変数でもスレッド内で参照出来るのです。
サンプルの為に即興で考えたコードですが、今まであまり使ったことが無かったThreadクラスを一度使ってみたら面白いかなと思いました。
ラムダ式の先頭記事へ ラムダ式の次の記事へ
タグ:ラムダ式