C#3.0から導入されたラムダ式
なにやらとても簡潔にコードが記述できるらしいが、以前見たときは意味不明だった。
LINQが簡潔に書けるらしく、LINQの説明と一緒にでてきてますます意味不明だった。
最近ようやく意味が分かってきたので、ざっくりと説明。
はやい話、デリゲートと式木を書くのが楽になるということ。
デリゲートがよくわかんない人は、デリゲートを先に知ってから覚えたほうがよいと思う。
デリゲートとはなんぞや
ちなみに、イベントハンドラってのがよく分かんない人も、先にイベントハンドラ覚えたほうが良いと思う。
イベントハンドラとはなんぞや
式木はまだ今いちよく分からないが、関数の中に関数を書いて式をつないでいくっぽい。
(jQueryっぽいな。メソッドチェーンのことかな? 知らんけど。)
とりあえず、今回はそのデリゲートが楽に書ける点をご説明。
んじゃ、例
ボタンを押したら、メッセージを表示する。というごく簡単なプログラム。
(ちなみにwpfフォームで新規作成してボタンを配置したものがベース。)
■普通の方法
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.btn_Test.Click += btn_Test_Click;
}
void btn_Test_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Push");
}
}
これだと、「ボタンを押すとメッセージを出す」といったような処理をするために、毎回イベントハンドラとなる関数を作成しなくてはいけなかった。
もちろん、ボタンが押されたら呼び出される関数を共通化してもよいが、このボタンならメッセージで、このボタンなら関数を実行と判断するためには、引数だったりと何かしら判断材料が必要なので、めんどい。
それで、結局そのボタンからしか呼ばれないのに、ボタンの数だけで関数があったりしていた・・・。
そこで、C#2.0で匿名メソッドができた。
そのボタンからしか使われないのに、わざわざ名前つけて関数つくらなくてもいいじゃん。
ということで、以下のように書けるようになった。
■匿名メソッド
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.btn_Test.Click += delegate(object sender, RoutedEventArgs e)
{
MessageBox.Show("Push");
};
}
}
関数名をつけず(匿名)、delegateと書いて、残りの引数と処理内容を記述する。
これで、無駄な関数を増やす必要がなくなった。
さらに、C#3.0で、ラムダ式が導入され、型推論されることになり、下記のように書けるようになった。
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.btn_Test.Click += (sender, e) => { MessageBox.Show("Push"); }; } }
左辺=>右辺
で表し、左辺の引数を右辺の式へ代入するという意味を持つらしい。
=>はゴーズ・トゥ(goes to)と読むらしい。
もはや型宣言も不要。
おそらく、左辺のClickの型が下記のようなデリゲートなので、
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
型宣言しなくても推論してくれてるっぽい。
これは、かなりコードがすっきりする。
さらに、一行だったら中括弧いらないらしいので、下のようになる。
this.btn_Test.Click += (sender, e) => MessageBox.Show("Push");
とてもスッキリだ。
LINQはまた今度調べてみよう。
LINQについて記事書いた → [C#] LINQとはなんぞや
参考
http://msdn.microsoft.com/ja-jp/library/bb882516.aspx