C#_匿名関数とは

経緯
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 を定義
        ing f(int n) => n * 10;

        Console.WriteLine(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/

以上。