ラムダの回 2011/01/12 1 担当:くま PochiNet ラムダとは C#3.0(Visual Studioだと2008)にて誕生 delegateやLINQをシンプルに記述するため に作られた言語仕様 2 PochiNet 分かりやすい例 ■匿名メソッド static void Main() { var dataSource = Enumerable.Range(1, 100); var query = dataSource.Where(delegate(int i) { return i % 13 == 0; }); foreach (var num in query) { Console.WriteLine(num); } } ■ラムダ static void Main() { var dataSource = Enumerable.Range(1, 100); var query = dataSource.Where(i => i % 13 == 0); foreach (var num in query) { Console.WriteLine(num); } } 3 PochiNet とりあえず文法から 基本はラムダ演算子「=>」 左辺 => 右辺:左辺を右辺に入力 と読む (x, y) => x + y は、xとyをx+yに入力と読めばよい 英語だと「=>」は「goes to」って読む (引数)=> {実行内容} 4 PochiNet 匿名メソッドからラムダへ 匿名メソッド : delegate(int x, int y) { return x + y; } ラムダ : (x, y) => x+y 違い – – – – – キーワード(delegateとreturn)が消えた 引数の型指定(int)が消えた 記号(中カッコ({、})と文末のセミコロン(;)が消えた 「=>」の2文字が増えた トータルで25文字減! 5 PochiNet 匿名メソッドからラムダへ詳細 delegate(int x, int y) { return x + y; } (x, y) => x+y 詳細 – – – – delegate → 「=>」 に置き換え return → ラムダは「式」なので returnがいらない {、}と; → 「式」だからいらない 引数の型指定 → delegateで宣言されているから分かっている 6 PochiNet まとめて見てみる 7 PochiNet 文法をちょっと掘り下げる ~左辺~ 左辺はdelegateとして呼び出されるメソッ ドのパラメータ(=入力パラメータ) パラメータによる書き方の違い – () => 右辺 – x => 右辺 – (x, y) => 右辺 //パラメータなし //パラメータ1つ //パラメータ2つ 8 PochiNet 文法をちょっと掘り下げる ~右辺~ 右辺には式か文 式(expression) ※末尾にセミコロンなし – (x , y) => x + y – (sender, e) => Console.WriteLine(“式”) 文(statement) ※{}で囲んで式にはコロンをつける – (sender, e) => { int count = 3; string msg = String.Format(“{0}つの文です。”, count); MessageBox.Show(msg); }; 9 PochiNet 掘り下げた状態でちょっと見てみる 今回のサンプルはこれ \trunk\Source\Samples\PochiNetSamples\PochiNetSamples.sln \Lambda.proj ここのリポジトリに入ってます http://cl106927e5.aspac.local:8080/svn/PochiNet 色んな書き方ができます – 01文法 参照 10 PochiNet 文法ばっかりだとアレなので ラムダ式とは名前のないメソッド 生成結果(=ラムダ式中身)はそのままデ リゲート型の変数や引数に入れて使う つまり、呼び出しは、名前ではなく、デリ ゲート型の変数や引数などを経由して行う 11 PochiNet 何をいっているかというと とりあえずソースをみてみる – 02ラムダとは参照 – デリゲートであるMyAction型の変数actionを経由して呼び 出しを行っている ラムダ式を使わないとこんな感じ – 式の部分を別メソッドとしてもう1つ定義が必要 12 PochiNet ActionやFunctionを使うと ラムダからちょい外れるけど、Actionや Functionを使うと宣言がいらない 欠点 1. 3.5より前の環境で動かない 2. 個別に宣言した方が用途が明確 利点 1. より見やすくなる 13 PochiNet ラムダ式の利点 短くなることよりも上位スコープにアクセ スできること – 03ラムダ利点参照 – 02ラムダとは のラムダを使わないクラスと比べる 利点 1. 引数地獄に陥らない 2. 少数のdelegate宣言で足りる 14 PochiNet 気をつけること キャプチャされる変数 – 03ラムダ利点の、気をつけるべきこと参照 延命措置がとられる – CreateMethodの変数Messageはreturn後も残る – ラムダで使用されている場合、ラムダの寿命まで残る ※正確には、ラムダ式がガベージされるまで 要は変数の使い方に気をつけよ! 15 PochiNet 気をつけないとどうなるか? あんまり考えなかったときの例 – 04変数のキャプチャ参照 ForとForeachで異なる場合 – For文では0と1を返したはずなのに忘れてる – Foreachではちゃんと覚えてる ForとForeachで同じになる場合 – int j はLoop毎にインスタンスが作られる 16 PochiNet 結局便利なの? 便利な使い方をみてみる – 05素敵さを体感/06素敵さを体感 参照 違い 1. 継承がなくなり、クラスが2つ減った 2. 抽象メソッドのSayMyNameがDelegateになった 3. 名前を保存するフィールドの宣言がなくなった 17 PochiNet 良い?悪い? 利点 1. ソースがスッキリ 2. 名前で参照できなくなったから守られる 欠点 1. 他のメソッドから参照できない ※そのメソッドもラムダ式として書けば使える 2. クラスに属するメソッドなのに、thisが使えない ※変数キャプチャをうまく使う 適材適所で! 18 PochiNet 気をつけること2 オーバーロードの自動解決 – 07気をつけること2 参照 ラムダ式は、より適していると思われるも のを勝手に呼ぶ 19 PochiNet その他、特徴など 式ツリーが使える 式ツリーとは? – 式ツリーは3.5からの新機能 – 実行中に、式をオブジェクトのツリーとして構築し、コン パイルと実行ができる 主にLINQで使うので、またの機会に! 20 PochiNet まとめ ラムダは色々簡単にかけるようになった ラムダは簡単に書くためだけではないのだ 真価を発揮するのはLINQにてのもよう 21 PochiNet 参考ページ [完全版]究極のC#プログラミング Chapter6 ラムダ式 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_06/extremecs_06_01.html C#3.0入門 第1回 ラムダ式 http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_01/csharp30_01_01.html MSDN ラムダ式 http://msdn.microsoft.com/ja-jp/library/bb531253.aspx 22 PochiNet 次! きっと次はLINQがいいと思う 23 PochiNet
© Copyright 2024 ExpyDoc