【问题标题】:references kept by anonymous methods and lambdas匿名方法和 lambda 保存的引用
【发布时间】:2012-02-23 23:59:03
【问题描述】:

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

这里有一段代码来演示匿名方法和 lambda:

    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());
        }
    }

【问题讨论】:

    标签: c# lambda anonymous-methods


    【解决方案1】:

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

    【讨论】:

    • 很抱歉再次提出这个问题,但是.. 为什么?为什么 指针也为上面示例中具有方法范围的“j”变量捕获?如果'j'变量是静态的,所以它有类型范围而不是类范围怎么办?我还没有对这个答案投赞成票,因为我仍然被这些问题所困扰。
    • @mtijn:在您的LambdaMethodScope 示例中(我写此答案时不存在)它不需要 需要捕获this,因为@987654323 @ 是一个局部变量。在您的 AnonymousMethodMethodScope 示例中,它是一个 instance 变量,因此匿名方法必须捕获 this 以便稍后设置 this.j。如果您要对两种做某事的方式进行比较,您需要确保在两个示例中都在做同样的事情!如果j 是静态的,它就不需要捕获任何东西。
    • @mtijn:请注意,only 需要捕获this 的匿名函数可以只使用在同一类型中创建的实例方法。这适用于您的第二个匿名方法示例 - 但不适用于第一个,需要捕获局部变量(参数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2011-06-23
    • 2011-02-08
    • 1970-01-01
    • 2011-01-17
    • 2011-10-13
    相关资源
    最近更新 更多