由匿名方法和lambdas保存的引用

时间:2012-02-01 09:36:30

标签: c# lambda anonymous-methods

.NET 2.0或4.0编译器为匿名方法生成的代码和.NET 4.0编译器为等效lambda生成的代码中产生的引用是否有任何差异?特别是对于this指针:我知道匿名方法和lambdas都是C#编译器功能,编译器实际上生成了一个带有委托的嵌套类和外部变量所需的所有引用,但是this article的实现是匿名方法声明引用保留在指针上,我找不到任何描述lambdas类似内容的源代码。或者我找不到任何东西,因为编译匿名方法的实现将1对1映射到lambdas的实现?

这里有一些代码来演示匿名方法和lambdas:

    class AnonymousMethodMethodScope
    {
        private Func<bool> d;
        public Func<int, bool> d2;
        int j = 0;

        public void Test(int i)
        {
            d = new Func<bool>(delegate { j = 10; return j > i; });

            // what references does this anonymous method keep?
            d2 = new Func<int, bool>(delegate(int x) { return x == j; });

            Console.WriteLine("j = " + j + " result = " + d());
        }
    }

    class LambdaMethodScope
    {
        private Func<bool> d;
        public Func<int, bool> d2;

        public void Test(int i)
        {
            int j = 0;

            d = () => { j = 10; return j > i; };

            // what references does this lambda keep?
            d2 = x => x == j;

            Console.WriteLine("j = " + j + " result = " + d());
        }
    }

1 个答案:

答案 0 :(得分:2)

是的,在捕获变量时,lambda表达式会做(并且必须做)与匿名方法相同的事情。 (我假设你在谈论转换为委托的lambda表达式;如果将它们转换为表达式树,它们可能会有所不同 - 我不确定。)