C#_Func<T, TResult> ( ラムダ式 ) 01

急に出てきたので調べた。

用意されたデリゲート

 

ラムダ式復習の次に Func 記載。

ラムダ式

 ラムダ式は匿名メソッドの記法簡略化。

delegate や { return } などの記述を省略できる。
型推論機構が働く。

ex )

    // C# 2.0 まで
    delegate ( int n )
    {
        return n > 0
    }
   
    // C# 3.0 のラムダ式使用
    ( int n ) => { return n > 0; };
   
    // さらに省略
    (int n) => n > 0;

 

引数の型が明らかな場合、型も省略できる。

    delegate bool Hoge(int n);
   
    // ラムダ式
    Hoge h = n => n > 0;

 

式が複数になる場合は省略せず、{ } でくくる。

    Func<int, int, int> f =
    (x, y) =>
    {
        int sum = x + y;
        return 10 * sum;
    }

 

Func<T, TResult>

デリゲートを定義するのが面倒なので、Func という名前のデリゲート
標準で用意されている。

    Func <引数、 戻り値>

戻り値がない場合 ( void ) 、 Action<T> を利用する。

 

delegat 使用すると以下のように書け、

    delegate int Hoge(int x, int y);

 

Func を使用すると以下のように略せる。

    Func<int,int,int> hoge;

 

ちなみに、定義されている型 ↓ 
https://www.ipentec.com/document/csharp-delegate-func-action-type より拝借。
f:id:koshinRan:20180921190417p:plain

ex ) 略ソース

    private int Hoge(int a, int b)
    {
        // なにかの処理
        return xxxx;
    }
   
    private int Fuga(int a, int b)
    {
        // なにかの処理
        return xxxx;
    }
   
    private void main()
    {
        Func<int, int, int> func = Hoge;
       func(4, 8); // Hoge の処理が実行
       
        func = Fuga;
        func(0, 2); // Fuga の処理が実行
    }

 

 

Expression 式木  memo

ラムダ式式木データとして扱うことができる。

ラムダ式を Expression 型の変数に代入すると、式木データとして扱える。
式中の項を取り出すといった操作が可能。

    Expression<Func<int, bool>> e = n => n > 0;
    BinaryExpression lt = (BinaryExpression)e.Body;
    ParameterExpression en = (ParameterExpression)lt.Left;
    ConstantExpression zero = (ConstantExpression)lt.Right;

 

Expression:
式木を組み立て、コードを動的に生成することができるライブラリ。
この機能を使用して関数電卓や簡単なコンパイラを作れる。

式木
式の木。 https://qiita.com/elipmoc101/items/3d76457394815af98bb1 より拝借。
「 4 + 5 」と「 4 + 2 * 3 」
f:id:koshinRan:20180921190928p:plain

ラムダ式をプログラムとしてではなく、データとして扱うことができる技術。

 

 

 

こちらから。

https://ufcpp.net/study/csharp/sp3_lambda.html
https://qiita.com/elipmoc101/items/3d76457394815af98bb1
http://vbegg.webcrow.jp/WinForms/Order/ExpressionTree/expressiontree.html
https://www.ipentec.com/document/csharp-delegate-func-action-type

 

以上。