ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

匿名メソッドとラムダ式について

f:id:covory10101101276:20171205141445p:plain

みなさんこんにちは🌚

昨日朝ごはんを食べた瞬間に胸が苦しくなって病院に担ぎ込まれたブルーノです。結局原因は不明だそうですがいまだに深く息を吸い込むと胸が痛くなります。肋間神経痛かもしれません。まあしばらくご飯はゆっくり食べる事にします😅さて今回は匿名メソッドとラムダ式というものについてまとめていきます

 

匿名メソッド

前回はすでにあるメソッドをデリゲートを通して実行し、いちいちインスタンス化→実行という手間をかけない方法についてやりましたが、今度の匿名メソッドはメソッドをあらかじめ定義しておく必要も無くなってしまいます。では下の図を見てください

f:id:covory10101101276:20171205145411p:plain

f:id:covory10101101276:20171205145416p:plain

7~11行目のShowメソッドは入力された文字列をそのまま返すシンプルなものです。22行目でこのメソッドのデリゲートを作成し、次の行で呼び出しています。ここまでは従来のデリゲートと同じです。その次の25行目で少し従来のものと違った宣言の仕方をしているものがありますね。

MyDelegate b = delegate(引数) { ... }

従来のデリゲートと比較してみましょう

delegate b = new Mydelegate(引数)

デリゲート名(赤字)デリゲートの宣言(青字)が逆になっているほか、匿名メソッドは後ろに{ ... } とありますね。実はここにメソッドの中身を書き込むようになっていて、デリゲートの宣言と中身をここでいっぺんにできてしまうのです。つまり、メソッドの名前を書き込まずにデリゲートの宣言だけでメソッドを作ることができるので、匿名のメソッドというわけですね!実行結果は見て分かるように両者に差はありません。では次に、この匿名メソッドをさらに簡略化できてしまうラムダ式についてまとめます。

 

ラムダ式

先ほどの匿名メソッドの他にデリゲートを簡略化する方法として、ラムダ式というものが存在します。まずは下の画像を見てください。

f:id:covory10101101276:20171205161342p:plain

f:id:covory10101101276:20171205161347p:plain

メインメソッドの中の14行目が通常の呼び出し、16~17行目がラムダ式による呼び出しになっています。ラムダ式の呼び出し方は以下のようになっていますね

MyDelegate b = () => { ...; };

この{ ... }のなかで呼び出すメソッドを指定しています。この => という矢印みたいなものをラムダ演算子と言います。矢印の手前の()にはデリゲートへの引数が入ります。今回は引数は指定していないので空白ですね。また、{ ... }のなかに

{ Console.WriteLine("..."); }

のように直接メソッドの内容を書き込むこともできます。こうするとまるで匿名メソッドのようですね。さっきの4行程の匿名メソッドの記入がラムダ式なら1行で終わってしまいました。こっちの方が楽ですよね。実際C#の開発者の方も「ラムダ式が先に導入されていれば匿名メソッドはいらなかった」と発言しているそうです(笑)。

また、マルチキャストデリゲーションについては以下の通りです。

f:id:covory10101101276:20171205163244p:plain

f:id:covory10101101276:20171205163252p:plain

今回はここまでにしておきます。

ラムダ式があれば簡単なメソッドならいちいち定義せずに実行できてしまいそうですね。まあデリゲートの引数やデータ型の関係で似たようなメソッドしか定義できませんが便利そうです。今度は色々なunityゲームのオープンソースとかも見てみたいなぁ