gpt4 book ai didi

c# - lambda 究竟是如何工作的? C# 和线程

转载 作者:行者123 更新时间:2023-11-30 20:19:00 25 4
gpt4 key购买 nike

我找到了带有 lambda 表达式参数的启动线程的解决方案。

Thread amazonBuy1 = new Thread(() => amazon.Buy("Lego", visa, dhl));

所以,我的问题是 - lambda 究竟是如何工作的?当谈到线程参数时,怎么可能给一个带有参数的方法,而默认情况下是不可能的。

谢谢。

最佳答案

请允许我演示编译器在那里做了什么:

class __horribleTypeName {
public Something amazon;
public SomethingElse visa;
public AnotherSomething dhl;
public void __horribleMethodName() {
amazon.Buy("Lego", visa, dhl);
}
}

...

var __horribleLocalName = new __horribleTypeName();
__horribleLocalName.amazon = ... // etc
Thread amazonBuy1 = new Thread(__horribleLocalName.__horribleMethodName);

有道理吗?所以 lambda 内容成为编译器生成方法的方法体。您在体内访问的局部变量被提升到编译器生成的实例上的字段。请注意,此处使用的实际名称都是“不可发音的”——它们不能用 C# 表示——它们不是合法的 C# 标识符(但是合法的 IL 标识符)。上面是一个简单的例子——编译器在某些情况下可以做其他优化,包括将东西提升到重用的静态委托(delegate)实例(当没有捕获上下文时)。另请注意,如果 visadlhamazon实例字段,那么您捕获的是 this ,而不是字段本身;所以它可能是:

class __horribleTypeName {
public YourType __this;
public void __horribleMethodName() {
__this.amazon.Buy("Lego", __this.visa, __this.dhl);
}
}
...
var __horribleLocalName = new __horribleTypeName();
__horribleLocalName.__this = this;
Thread amazonBuy1 = new Thread(__horribleLocalName.__horribleMethodName);

附带说明:如果您想将状态传递给线程,可以使用 ParameterizedThreadStart

关于c# - lambda 究竟是如何工作的? C# 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39721521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com