所以我对编译器如何处理 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);
生成的类:
<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/