Contents
序文
共通で使用される関数内で展開されるデリゲート関数があったとします。(イメージで表現)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private void 共通部分(・・・デリゲート型 デリゲート関数){ foreach (var value in data) { デリゲート関数(value);//A,B,Cなど } } private void A(value){ 処理; } private void B(value){ 処理; } private void C(value){ 処理; } |
この共通部分()関数で呼び出される、A(),B(),C()関数は利用されるだけで、使い捨ての関数とはなりません。。。
使い捨ての関数が出た場合に使用するのが、「匿名メソッド/ラムダ式」です。
匿名メソッドは名前を持たないメソッドです。delegateを使いますが、最終的にはラムダ式を使う事になるそうです。
構文delegate
delegate(引数の型 引数) {
メソッドの本体 ();};
構文ラムダ式・・・delegateの代わりに、=>(アロー演算子)を使用します。
(引数の型 引数) => {
メソッドの本体(); };
以下、考え方とサンプルです。
フォームを用意してボタンを張り付けます。
1 2 3 4 |
private void ラムダ_Click(object sender, EventArgs e) { MessageBox.Show("このボタンのクリックの為に"); } |
ボタンを押下した時の処理を記述すると、その様にうごきます。
この動きは押下した時に利用されるだけで、使い捨てです。
また、この処理の記述はボタンをダブルクリックして、自動生成してから書く事が多いと思います。匿名メソッド/ラムダ式ではダブルクリックしないで作ります。
匿名メソッドでの記述
ボタン定義と共に、処理を記述する方法の一つとして、匿名メソッドがあります。
匿名=メソッド名無しで、メソッドの中身を記述しておきます。
1 2 3 4 5 6 7 8 |
public Form2()//コンストラクタ { InitializeComponent(); this.ボタン.Click += delegate (object sender, EventArgs e) { MessageBox.Show("クリックの処理を直ぐに記述"); }; } |
ラムダ式での記述
1 2 3 4 5 6 7 8 |
public Form2()//コンストラクタ { InitializeComponent(); this.ボタン.Click += (sender, e) => { MessageBox.Show("クリックの処理を直ぐに記述"); }; } |
delegateと省略できる(類推できる)型も不要となりました。