経緯
M(int value) => X = value; が匿名関数だと思ってた。違かったので調べた。
匿名関数=ラムダ式と捉えてよい感じ。
C# 2.0 では匿名メソッド式、C# 3.0 ではラムダ式という構文がある。
これらを合わせて匿名関数と呼ぶ。
ラムダ式は匿名メソッド式の上位互換。
匿名メソッドは C# 2.0 時代の互換性を保つためだけの機能。
ラムダ式
ラムダ式は引数リストと関数本体を => でつないで書く。
(int x) =>
{
int a = 10;
a += x;
return a;
}
関数名がないので、「匿名」と呼ばれる。
=> について
アロー演算子、goes to 演算子と呼ばれたりする。
x => 2 * x を x goes to 2x ( x が 2x に行く) と読むと英語的にしっくりくる。
なお、
=> の後ろの関数本体が 式 1 つだけの場合、{ } と return を省略して
以下のように書ける。
( int x ) => x * x;
また、引数の型を推論できる場合には型の省略も可。
この時、引数が 1 つだけなら ( ) も省略できる。
(x, y) => x * y;
x => x * x;
=> の使用例
Where や Select で使用できる。
ary.Where( x => x > 3 ).Select( x => x * 2);
+α ローカル関数について
C# 7 では関数の中で、別の関数を定義して使うことができる。
ローカル関数という ( その場所でしか使えない関数 )。
ローカル関数は定義した関数でしか使えない。
ex )
static void Main()
{
// Main 関数の中でローカル関数 f を定義
int f(int n) => n * 10;
Console.WriteLine(f(5));
}
ローカル関数 f は定義した Main 関数 でしか使えない。
なお、メソッド以外にも
コンストラクタ、プロパティ、インデクサ、イベント、
演算子、ユーザー定義の型変換、デストラクタ ならどの中でも定義できる。
ローカル関数の使い道
あるメソッド Hoge の中から、Hoge でしか使わないメソッドを
呼び出したい場面が時々ある。
Hoge でしか使わないメソッドに HogeOnly など、
あまり意味のない名前を付けるのは不格好。
また、以下の HogeOnly は別のメソッドからも呼べてしまう。
このような場合にローカル関数を使えば呼びたい場所からだけ呼べる。
ex) NG 。Hoge 以外のメソッドからも呼べてしまう。
static void Hoge()
{
HogeOnly();
}
static void HogeOnly()
{
//処理
}
ex ) ローカル関数
static void Hoge()
{
void h()
{
//処理
}
}
こちらから。
http://ufcpp.net/study/csharp/functional/fun_localfunctions/
以上。