1

以下のコードは機能していますが、なぜですか? ループで匿名メソッドを呼び出すと、x と y はどこに来て保存されますか。

ありがとう

    static void Main(string[] args)
    {
        int x=1;
        int y=2;
        var dic = GetDic(x, y);

        for (int i = 0; i < 5;i++ )
        {
            System.Console.WriteLine(dic[i].Invoke().ToString());
        }

    }

    private static Dictionary<int, Func<int>> GetDic(int x, int y)
    {
        var dic = new Dictionary<int, Func<int>>()
        {
            {0,()=>{return y;}},
            {1,()=>{return x;}},
            {2,()=>{return x+y;}},
            {3,()=>{return x-y;}},
            {4,()=>{return y-x;}},
        };
        return dic;
    }
4

2 に答える 2

3

ラムダ式は個別のメソッドにコンパイルされます。周囲のコードのローカル変数を使用しない場合、それらは同じクラスのメソッドにコンパイルされます。ただし、ローカル変数が使用されている場合 (この場合のように)、コンパイラは周囲の型にネストされたクラスを作成し、使用されているローカル変数に一致するコンパイル済みのメソッドとフィールドをそこに配置します。ラムダ式が使用されると、そのクラスのインスタンスが作成され、値がインスタンス フィールドに格納されるため、ラムダ メソッドはそれらにアクセスできます。

これは、ラムダ式で周囲のメソッドからローカル変数を使用すると、パラメーターと他の型の静的メンバーのみを使用するラムダ式よりもわずかにコストがかかることも意味します。

于 2012-05-18T19:36:08.897 に答える
1

それらは、デリゲートのTargetフィールドで生成されたクロージャ クラスに保存されます。

詳細については、私のブログ投稿を参照してください。

于 2012-05-18T19:32:12.823 に答える