話には聞いていた「ラムダ式」。
無名関数のことだったのね~。
MSDN?:ラムダ式 (C# プログラミング ガイド)
Wikipedia:C#の無名関数
【環境】
Visual C#: 15.5.4(2017)
序章
といいつつ、無名関数のことも、まだ良く理解できていない。。。
いつもの如く、習うより慣れろ!で頑張るぞ~!
概念
一言で言うと
ラムダ式とはメソッド定義を式として扱える機能のこと
Qiita:関数型プログラミングって何、ラムダってなんだよ ラムダ式(2016-10-23)
本日、初対面の「ラムダ式」の情報に目を通してきたけど
この一言で、それなりにまとまった気がする。
ありがとうございます。
ザックリ
私なりに解釈すると、今まで1つ1つメソッドを実装してきたけど
ラムダ式なら、わざわざメソッドとして切り出さなくても、式の中に入れ込めるよ!
ってことかしらね~。
三項演算子
直感では「三項演算子」とイメージが似ていると思う。
// if で真面目に書く
if (a) { return b; }
else { return c; }
// 三項演算子を用いる
(a) ? b : c;
// 真面目にメソッドを実装する
string result = GetResult(value);
private string GetResult(string value)
{
return "result : " + value;
}
// ラムダ式で書く
string result = (value) => "result : " + value;
書式
// 式形式
(引数) => 処理
// ステートメント形式
(引数) => {処理}
// 非同期ラムダ
MSDN?:ラムダ式 (C# プログラミング ガイド) 参照
// 標準クエリ演算子でのラムダ
MSDN?:ラムダ式 (C# プログラミング ガイド) 参照
ルール
式形式
右辺は、式ツリーとなるらしい。
(value) => "result : " + value
右辺の行末 ;(セミコロン)は不要
もちろん、行全体の行末 ;(セミコロン)は必要
ステートメント形式
右辺は、デリゲートとなるらしい。
(value) => { return "result : " + value; }
引数が1つのときは () を省略できる
value => "result : " + value
引数がないときは、() だけ記述する
() => "result : OK"
このときの () は省略できない
引数を複数設定できる
(a, b) => "result : " + a + ", " + b
引数の型を指定できる
ラムダ式では、型推論によって、型を解決できるので
型の指定は不要だけど、指定することも可能。
(string value) => "result : " + value
- ラムダにはデリゲート型と同じ数のパラメーターが含まれていなければなりません。
- ラムダに含まれる各入力パラメーターは、対応するデリゲート パラメーターに暗黙的に変換できなければなりません。
- ラムダの戻り値 (ある場合) は、デリゲートの戻り値の型に暗黙的に変換できなければなりません。
MSDN?:ラムダ式 (C# プログラミング ガイド)
=>
=> を「ラムダ演算子」という。
変数スコープ
- ラムダ外の変数を参照できる
- ラムダ内の変数を外部から参照することはできない
ザックリ理解するとこんな感じ?
正確な情報は下記の通り。
- 取り込まれた変数は、その変数を参照するデリゲートがガベージ コレクションの対象になるまでガベージ コレクトされません。
- ラムダ式内に導入された変数は、外側のメソッドでは参照できません。
- ラムダ式は、外側のメソッドの ref パラメーターまたは out パラメーターを直接取り込むことはできません。
- ラムダ式に含まれる return ステートメントで外側のメソッドを戻すことはありません。
- ラムダ式には、 goto ステートメント、 break ステートメント、およびジャンプ ステートメントのジャンプ先がブロック外である場合はラムダ式の内部にある continue ステートメントを含めることはできません。 また、ジャンプ先がブロックの内部にある場合は、ラムダ式の外部でジャンプ ステートメントを使用するとエラーになります。
MSDN?:ラムダ式 (C# プログラミング ガイド)
参考サイト
Qiita:はじめての LINQ(2018-01-16)
→LINQ 全体だけど、ひとまずこちらへ。勉強!
Qiita:関数型プログラミングって何、ラムダってなんだよ ラムダ式とスコープ(2016-10-23)
Qiita:C# 今更ですが、ラムダ式(2017-10-27)
→何度も読み返して勉強しましょう!
Qiita:【LINQの前に】ラムダ式?デリゲート?Func?な人へのまとめ【知ってほしい】(2015-02-17)
→何度も読み返して勉強しましょう!
Qiita:C#のExpressionで動的コード生成(2017-12-19)
→式形式(式木、式ツリー)の勉強に!
Qiita:LINQとラムダ式ってなにができるの?(2015-10-04)
→こちらのおかげで、メソッドへ引数を渡す方法に気がついた
@IT:C#ラムダ式 基礎文法最速マスター(2010-03-09)
→ここも分かりやすかった
iPentec:デリゲートとラムダ式の書き換え =>演算子の利用 (C#プログラミング)
→デリゲートと比較しながら勉強するのによさそう