- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了带有 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)实例(当没有捕获上下文时)。另请注意,如果 visa
或 dlh
或 amazon
是实例字段,那么您捕获的是 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/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!