代码之家  ›  专栏  ›  技术社区  ›  Jorge Córdoba

lambda表达式如何在内部工作?

  •  7
  • Jorge Córdoba  · 技术社区  · 16 年前

    在查找此问题的答案时:“ Why is an out parameter not allowed within an anonymous method? “我对lambda表达式和匿名方法的实际工作方式有点迷茫。

    在注释中,jaredpar指出“假设out参数引用了堆栈上的局部变量。lambda可以在将来的任意点执行,因此可以在堆栈帧不再有效时执行”。

    我指出,如果其他变量不是这样的话…这基本上让我想知道关于lambda表达式我真正知道什么。

    我想到的是这样的事情:

    public void Foo(ComplexObject val, out SomeDelegate outDelegate)
    {
      ComplexObject obj = new ComplexObject(val)
      SomeDelegate = delegate(int other) { return (obj.value * other); }  
    }
    
    public void Bar()
    {
      SomeDelegate MyDel = null;
      Foo(5, out MyDel);
      int finalRes = MyDel(100);
      // Whatever
    }
    

    在那种情况下,我真的不知道发生了什么。obj是堆栈上的一个引用,在方法返回时将不再有效,因此annonymous方法应该能够(如果可行)实际知道这是一个引用类型,并复制引用而不是值,如果确实如此…如果“用例”或多或少相同,那么引用参数为什么不起作用?

    2 回复  |  直到 16 年前
        1
  •  8
  •   JaredPar    16 年前

    我做了一个相当广泛的关于闭包如何在内部工作的博客系列。它是为vb.net实现闭包而编写的,但是底层的细节与c非常相似。它应该提供您正在寻找的答案。

    这是链接到第6部分的链接,该部分链接到所有其他文章

        2
  •  6
  •   SLaks    16 年前

    乔恩·斯基特写了一篇 in-depth description .

    基本上,编译器将外部方法转换为类,并将匿名方法访问的所有变量转换为类上的字段。匿名方法成为类上的常规实例方法。