【问题标题】:How do lambda expressions work internally?lambda 表达式如何在内部工作?
【发布时间】:2010-12-10 22:35:49
【问题描述】:

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

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

【问题讨论】:

    标签: c# lambda anonymous-methods


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      Jon Skeet 写了一封 in-depth description

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

      【讨论】:

        猜你喜欢
        • 2018-12-21
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 1970-01-01
        相关资源
        最近更新 更多