c# - lambdas 如何作用于局部变量?

标签 c# compiler-construction lambda

所以我对编译器如何处理 lambda 的理解是有限的。

我的理解是,编译器采用您的 lambda 并将其转换为真正的方法。

如果是这样,那么它如何作用于局部变量?

    public async Task<dynamic> GetWebStuff()
    {
        dynamic ret = "";

        WebClient wc = new WebClient();          

        wc.DownloadStringCompleted += async (s, a) => 
        {
            ret = await Newtonsoft.Json.JsonConvert.DeserializeObject(a.Result.ToString());
        };

        wc.DownloadString("http://www.MyJson.com");

        return ret;
    }

上面的例子会将ret的返回值设置给调用者,调用者是一个反序列化JSON的动态对象。

如果编译器采用已完成的事件 lambda 并将其抽象到自己的方法中,那将如何发生?它如何知道设置 ret 值?

这就像我说的(这显然行不通)

        public async Task<dynamic> GetWebStuff()
        {
            dynamic ret = "";

            WebClient wc = new WebClient();

            wc.DownloadStringCompleted += wc_DownloadStringCompleted;            

            wc.DownloadString("google.com");

            return ret;
        }

        void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            ret = await Newtonsoft.Json.JsonConvert.DeserializeObject(e.Result.ToString());
        }

最佳答案

它会创建一个匿名类。例如考虑这段代码:

int x = 0;

Action action = () => x = 2;

action();

Console.Write(x);

生成的类:

enter image description here

<Main>b__2 的 IL 代码设置 x 值的方法:

    .method assembly hidebysig instance void 
        '<Main>b__2'() cil managed
{
  // Code size       10 (0xa)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.2
  IL_0002:  stfld      int32 ConsoleApplication1.Program/'<>c__DisplayClass0'::x
  IL_0007:  br.s       IL_0009
  IL_0009:  ret
} // end of method '<>c__DisplayClass0'::'<Main>b__2'

关于c# - lambdas 如何作用于局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896668/

相关文章:

C# - NHibernate带来多对多关系的多条记录

c - x86 addl 与 subl

c++ - VC 中哪种大小的结构成员对齐会带来性能优势?

Python lambda 和作用域

c# - C# 中的 lambda 表达式和消息框

c++ - 在没有实例的情况下调用无状态 lambda(仅类型)

c# - 带字符串数组的串联 Where 子句

c# - Unity StopCoroutine 不工作

c# - 构造函数的命名/可选参数是否有性能损失?

c# - 只编译当前项目而不检查引用的项目