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 );    }}
基本的に、外部の変数を使用していない場合のみなので、
スレッドには影響しません。

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

0 件のコメント:

コメントを投稿