c#は古いバージョンしか分からないです。2005とか。
というより、いまc#を勉強しています。
ラムダ式というのが分かりません。
いろいろサイトを見ていたんですが、書いていることが難しくて。
ラムダ式って参照というものではないのでしょうか?
初心者にもわかりやすく教えてもらえないでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
次のコードを見てください。
(1)~(5)はすべて同じことをします。
C#
1using System; 2 3namespace ConsoleApp1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 // (1) 10 Console.WriteLine(Add(2, 3)); 11 12 // (2) 13 Func<int, int, int> add = Add; 14 Console.WriteLine(add(2, 3)); 15 16 // (3) 17 add = (int a, int b) => { return a + b; }; 18 Console.WriteLine(add(2, 3)); 19 20 // (4) 21 add = (a, b) => { return a + b; }; 22 Console.WriteLine(add(2, 3)); 23 24 // (5) 25 add = (a, b) => a + b; 26 Console.WriteLine(add(2, 3)); 27 28 Console.ReadKey(); 29 } 30 31 static int Add(int a, int b) 32 { 33 return a + b; 34 } 35 } 36}
(1)
この後に定義された static int Add(int a, int b) メソッドを呼び出し、その戻り値をコンソールに出力しています。
(2)
Func<int, int, int> はデリゲート型と呼ばれる型の一つで、デリゲート型はメソッドを代入することができます。
Func<int, int, int> add = Add; と書くことで、デリゲート型の変数 add にメソッド Add を代入しています。
代入されたのは、メソッドを呼び出して得られた戻り値ではなく、メソッドそのものです。
ですので、この後 add(2, 3) と書いて Add(2, 3) を呼び出すことができます。
(3)
デリゲート型の add を再利用していますが、今度はメソッドではなくラムダ式を代入しています。
ラムダ式はデリゲート型に代入することでメソッドとしてコンパイルされ、呼び出すことができるようになります。
static int Add(int a, int b) とこのラムダ式を比較してください。
戻り値の型とメソッド名が省略され、引数と中身が ラムダ演算子(=>) で結ばれていますが、表記はメソッドそのものです。
C#
1// ラムダ式 2Func<int, int, int> add = (int a, int b) => { return a + b; };
C#
1// メソッド 2int Add(int a, int b) { return a + b; }
(4)
add は Func<int, int, int> 型の変数なので、ここで引数の型が宣言されています。
なので、引数の型を省略することができます。
(3) のラムダ式から引数の型を省略したのがこれです。
また、引数が一つの場合は () も省略できます。
C#
1// 引数が一つの場合 2Func<int, int> Increment = a => { return a + 1; }
(5)
処理内容が一つの式に収まる場合は、{} と ; と return を省略することができます。
(4) のラムダ式から省略したのがこれです。
#まとめ
- デリゲートはメソッドを代入できる型である
- ラムダ式はデリゲートにキャストすることでメソッドになる
- デリゲートにキャストされるラムダ式は簡単に書けるよう多くの省略が許可されている
#余談:デリゲートでないラムダ式
ラムダ式が使われるのはデリゲートだけではありません。
例えば LINQ to SQL ではラムダ式をメソッドではなく SQL(つまり文字列)にコンパイルします。
ラムダ式は本来は式木と呼ばれるデータ構造を表現するためのものでアルゴリズムをデータとして表現するもので(C# の場合です。数学のラムダ式とは違います)、デリゲートや LINQ とは別の概念として理解してください。
LINQ で多用されるのがデリゲートで、デリゲートを簡単に記述するのがラムダ式です。
投稿2018/10/01 00:52
編集2018/10/01 22:56総合スコア28669
0
こんにちは。
ラムダ式というもののを一言で表すのは、知識レベルにもよるため難しいですが、C#の文法としてのラムダ式を簡単に説明するなら、
- 変数に入れたり引数に渡したりできる「メソッド」を表現したもの
というのが理解しやすいかと思います。
ラムダ式はメソッドそのものであると考えてよく、=>
の左側がメソッドの引数、右側がメソッドの内部処理に相当するものです。
ラムダ式の用途は「手続きそのものをメソッドの引数に渡したい」という場面で役立ちます。
例えば、Linqに関連してよくラムダ式の解説が登場しますが、Linqの各メソッドは「どのような処理をするのかは決まっていない」ので、その実処理をラムダ式として書いて引数に渡しているのです。
その他の細かいアレコレについては、上記をしっかり理解してからで良いでしょう。この内容が理解できなければ、その他の内容は高度すぎます。
投稿2018/09/30 17:07
総合スコア4252
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。