ラベル ラムダ式 の投稿を表示しています。 すべての投稿を表示
ラベル ラムダ式 の投稿を表示しています。 すべての投稿を表示

2016年9月11日日曜日

コンパイラによるラムダ式の展開

ラムダ式で、ラムダ式外部の変数を使っているか、いないかによって処理が少し最適化されているようです。


var val =10;var func = new Func<int32>(()=>;val);

コードを見てみると、上記のような場合には、そのままの形になっています。

var func = new Func<int32>(()=>; { int a = 10; return a*a; } );

このような形でラムダ式の外側の変数を使用しない場合には、
ラムダ式用のinnnerクラスを持ち、static関数を呼び出す形に最適化されているようです。
[Serializable]private sealed class innerclass{    public static readonly Program.innerclass inclass = new Program.innerclass();
    public static Func<int> func;
    internal int method()    {        return 1;    }}

private static void Main( string[] args ){    if( Program.innerclass.func == null )    {        Program.innerclass.func = new Func<int>(            Program.innerclass.inclass.method );    }}
基本的に、外部の変数を使用していない場合のみなので、
スレッドには影響しません。

以上です。だからどうしたといわれそうですが、それだけです。

2016年9月7日水曜日

C#6.0の新機能:メソッド本体にラムダ式

関数のラムダ式


VisualStudio2015で追加されたのC#6.0 で関数のラムダ式を試してみました。


public Int32 Add(Int32 val1, Int32 val2) => val1 * val2;


この使い道が想像できていません。関数をラムダ式で書く理由って何でしょうか?

ちなみに私は、ラムダ式を書くのに波括弧を使う癖があるのですが、
関数のラムダ式に入れたら、コンパイラ様に怒られました。

public Int32 Add2(Int32 val1, Int32 val2) => { return val1* val2; }
Error CS1519 クラス、構造体、またはインターフェイス メンバーの宣言でトークン '{' が無効です。





関数がラムダ式なら、Funcに入れられるかと思い、入れてみました。
ついでに、普通の関数もFuncに入れてみました。


public Int32 Add(Int32 val1, Int32 val2) => val1 * val2;
public Int32 Add2(Int32 val1, Int32 val2) { return val1 * val2; }

void SampleMethod()
{
    Func<Int32, Int32, Int32> func = Add;
    Func<Int32, Int32, Int32> func2 = Add2;
}


な、なんと、どちらも普通に動きます。
さぁ、やっぱり、使い道が分からなくなってきました。
誰か、使い方教えてけれ!!!!!!!!!!!!!!


2016年9月2日金曜日

ラムダ式が分かりにくい人へ

ラムダ式が分かりにくい人へ朗報です。






うそです。

ラムダ式のサンプルを見ていてよく思うのですが、よくあるサンプルが分かりにくいのって、
returnがないからじゃないですか?

var func1 = new Func<Int32, Int32>(val => val * 2);

これは、Int32の引数valを入力として、戻り値にval×2をした値を返しています。
CとかC++をやっていると、無意識に、return がない!!って文句言いたくなります。

ってことで、すこしずつ括弧を増やしていってみます。
var func1_1 = new Func<Int32, Int32>((val) => (val * 2));
これで、引数のvalと処理内容 (val * 2)が多少わかりやすくなったと思います。
じゃぁ、次はこれ!

var func2 = new Func<Int32,Int32>(
    (val) =>
    {
        return val*2;
    });
ここまでくれば、なんとなくジェネリックぽい感じで理解できるのではないでしょうか。
Funcに対して、引数の型と、戻り値の型を指定<Int32,Int32>しておいて、
引数使いたいから、引数の変数名(val)を書いておく。

でもって、ここから関数だよとコンパイラーに教えて(=>)あげて
あとは通常の関数みたいに書くだけです。

これで、ラムダ式は、完璧!!!

でも、これでラムダ式が書けるようになると、
シンプルなコードが書きたくなって、func1に近づいていくのだと思います。




ち・な・みに、


戻り値が必要なFuncで、波括弧で処理を囲う場合には、 必ずreturnが必要です。
var func4 = new Func<Int32, Int32>(
    (val) =>
    {
        val * 2;
    });

こうやって書くと、戻り値がないぞ!!ってVisualStudioさんに怒られます。
エラー CS1643 型 'Func<int, int>' の ラムダ式 に値を返さないコード パスがあります。