ラムダ式でパラメータがある場合
ここではラムダ式でパラメータを必要とする例をみてみましょう。
パラメータがない場合の例は デリゲートに普通のメソッド、匿名メソッド、ラムダ式をそれぞれ利用する例 をみてください。
クリック時の TickCount を渡す
「デリゲートに普通のメソッド、匿名メソッド、ラムダ式をそれぞれ利用する例」で作成した MyButton を次のように変更します。
using System;
namespace LambdaExp2
{
public class MyButton
{
public delegate void OnClickDelegate(int tick);
public OnClickDelegate OnClick;
public void Click()
{
if (OnClick != null)
{
OnClick(Environment.TickCount);
}
}
}
}
デリゲート OnClick は int を受け取ります。Click メソッドでは OnClick を呼び出すときに、TickCount を渡します。
ラムダ式を使って、デリゲートを定義して OnClick にセットする例は次のようになります。
using System;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LambdaExp2
{
class Program
{
static void Main(string[] args)
{
// ラムダ式 1
MyButton b1 = new MyButton();
b1.OnClick += tick => Console.WriteLine("{0}: Clicked!", tick);
b1.Click();
Thread.Sleep(1000);
b1.Click();
// ラムダ式 2
MyButton b2 = new MyButton();
b2.OnClick += (int i) => Console.WriteLine("{0}: Clicked!", i);
b2.Click();
}
}
}
実行結果は次のようになります。
32335840: Clicked! 32336838: Clicked! 32336838: Clicked!
最初の例では変数名のみラムダ式で宣言して利用しています。
Click メソッドを呼び出した後では、TickCount が変わったことがわかるように、少しスリープさせてから、もう一度 Click メソッドを呼び出しています。
二つめのラムダ式では (int i) として、型名をつけて変数を宣言しています。