将变量直接传递给Lambda方法?

时间:2013-06-06 06:19:46

标签: c# lambda

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

例如

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

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

5 个答案:

答案 0 :(得分:2)

它并不复杂,特别是如果您使用方法组语法:

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

答案 1 :(得分:1)

Lambda表达式可以采用如下参数:

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

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

有关详细说明,请参阅msdn document

答案 2 :(得分:1)

  

如何用1分号完成此操作?

有什么问题?

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

<强> UPD

将一些东西传递给lambda的最简单方法是闭包(这就是你的问题的样子)。这就是他们如此方便的原因。通过传递如here所示的参数,你就会破坏lambda的所有偏好。从下一个关于传递两个或更多参数的问题中,您应该清楚这一点。

使用闭包,您可以轻松完成此操作:

// somewhere in the code
var owner = // ...
var text = // ...
var caption = // ...

// here's the closures:
new Thread(() => MessageBox.Show(owner, text, caption)).Start();

如果没有它们,您需要获取(或制作)某些类型,这将是您的参数的容器,创建该类型的实例并初始化它的成员。实际上,当你使用闭包时,这是编译器为你做的工作。那么,为什么要阻止编译器完成所有这些脏工作呢?

答案 3 :(得分:1)

嗨,参见下面的参数化线程写代码

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

答案 4 :(得分:0)

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

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

有关详细信息,请参阅...... first 2nd third