[C#] [ざっくり]イベントハンドラとラムダ式

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

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>