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

时间:2009-10-28 16:37:20

标签: c# lambda anonymous-methods

在查找这个问题的答案时:“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是堆栈上的引用,它在方法返回时将不再有效,因此匿名方法应该能够(如果可行)实际知道它是引用类型并复制引用而不是值,如果它...如果“用例”或多或少相同,为什么不参考params工作呢?

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

Jon Skeet写了in-depth description

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