将变量直接传递给Lambda方法

本文关键字:Lambda 方法 变量 | 更新日期: 2023-09-27 18:17:04

是否有办法直接将变量传递给lambda方法?

例如

string s = "test";
new Thread(() => MessageBox.Show(s)).Start();

Lambda表达式真的让我的生活变得如此简单,为什么从外部世界传入一个变量看起来如此复杂?

将变量直接传递给Lambda方法

这并不复杂,特别是在使用method-group语法的情况下:

new Thread(MessageBox.Show).Start("test");

为参数化线程编写如下代码

string a = "test";
new Thread((s) => { s = "newTest"; }).Start(a);

Lambda表达式可以接受如下参数:

(string s) => MessageBox.Show(s);

这会改变动作的定义,所以接受lambda的方法需要能够接受新的委托。

我如何用1个分号完成这个?

有什么问题吗?

new Thread(() => MessageBox.Show("test")).Start();

乌利希期刊指南

传递一些东西给lambda的最简单方法是闭包(这就是你的问题看起来的样子)。这就是它们如此方便的原因。通过传递如下所示的参数,您将破坏lambda的所有首选项。从下一个关于传递两个或多个参数的问题中,您应该清楚了。

使用闭包,你可以很容易地做到这一点:
// somewhere in the code
var owner = // ...
var text = // ...
var caption = // ...
// here's the closures:
new Thread(() => MessageBox.Show(owner, text, caption)).Start();
如果没有它们,你需要获取(或创建)某种类型,它将是你的形参的容器,创建该类型的实例并初始化它的成员。实际上,当您使用闭包时,这就是编译器为您做的工作。那么,为什么要阻止编译器完成所有这些繁琐的工作呢?

是的,有很多方法可以做到。像

string s = "test";
new Thread((string parameter) => MessageBox.Show(s)).Start();

有关更多详细信息,请参阅......第一第二第三