Meiryo’s blog

やってみて詰まったことを備忘録として残すブログ

【C#】ラムダ式に慣れる1~デリゲートと匿名メソッド~

ラムダ式がわからない

独習C#を読み進めていてついに魔境「ラムダ式」にたどり着きました。
マジわからない。
全くもってわからない。
JavaSE持ってるけどラムダ式は捨てて受けた。わからない。

そんな不気味な物体だけど
こいつに慣れないと人の書いたコード読めなくなっちゃうので
戦うことにしました。

ラムダ式の雑な概要

変数にメソッドを入れることができるデリゲートというものがあり、
デリゲートで冗長なものを省ける匿名メソッドがある。
この匿名メソッドから更に無駄なものを省けるようにしたのがラムダ式っぽい

デリゲートを使ってみる

配列の中身を全部足し算するプログラムを
デリゲートを使って書いてみました。

最初にデリゲートを定義し(①)、
定義したデリゲートで宣言。そして使いたいメソッドを入れる(②)
最後にデリゲート型の変数をメソッドに渡してあげて実行。
こんな感じになってます。

変数なのでメソッドの差し替えも可能です。
次の画像は足し算メソッドを実行した後
変数に掛け算メソッドを代入して実行した結果です。
差し替えできて掛け算の結果が出力されてますね。

なにが嬉しいのこれ?

デリゲートを使ってないプログラムと比べてみます。
次の画像の左がデリゲート使っていなくて右は使っているプログラムです。
今回書いたプログラムだと「え?右のほうがわかりやすくね?」
ってなりそうですが・・・違いがあります。
デリゲートを使っている方はCalculationメソッドを
共通機能としているのでAdd、Multメソッドを実装するときに
配列の中身を取り出す操作を考えなくて済んでます。
デリゲートを使ってない方だとどちらも中身取り出す操作もしてますよね。
これが嬉しいポイントだと思われます。

匿名メソッド

匿名メソッドは名前を持たないメソッドのことです。
なにに役立つのかと言うと、
他から使われない、使い捨てのメソッドを
名前をつけずに作れることです。
Addメソッドでやってたことを匿名メソッドを使って
書いてみました。

Addメソッドを定義せずに同じことができました。

定義済みデリゲート

Calculationメソッドの引数にプログラムで定義していない
謎のAction型が使われています。
どこで定義したんだ、と思われるかもしれませんが
これは標準ライブラリで用意されているデリゲートの一つです。
よく使いそうなデリゲートは大体用意してくれているので
自分で定義しなくて済むようになっています。
下記サイトに一覧がありました。
汎用的に使用できる定義済みのデリゲート型は?[C#、VB] - @IT

Q.それで。結局デリゲートと匿名メソッドは何が嬉しいの?

A.わからん。
使いみちググったらイベントとか非同期で
役に立つとかなんとか。
そのうちやるかも。

とりあえずそれは置いといて次回ラムダ式行きます。