为什么我可以使用lambda表达式代替回调委托?

时间:2010-12-20 06:45:28

标签: c# .net syntax

我发现了一些新的C#语法,并不明白它的含义。这是与语法相关的代码:

1)

BeginInvoke(new Action(() =>
    {
        PopulateUI(ds);
    }));

2)

private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
}

new Action()的含义是什么?=>符号的含义是什么?

ThreadPool.QueueUserWorkItem的语法是ThreadPool.QueueUserWorkItem(new WaitCallback(PrintOut), "Hello");,但此处显示ThreadPool.QueueUserWorkItem(() => GetSqlData());,那么它是如何工作的?为什么WaitCallback丢失了?请详细解释。

非常感谢。

4 个答案:

答案 0 :(得分:6)

看看

Action Delegate

  

封装具有的方法   单个参数并且不返回   值。您可以使用Action   委托传递方法作为   参数没有明确声明   自定义代表。

Lambda Expressions (C# Programming Guide)

  

lambda表达式是匿名的   可以包含表达式的函数   和陈述,可以用来   创建委托或表达式树   类型。

     

所有lambda表达式都使用lambda   operator =>,读作“去   到了。“lambda的左边   运算符指定输入   参数(如果有的话)和右侧   持有表达或陈述   块。 lambda表达式x => X *   x读作“x转到x乘x。”

答案 1 :(得分:5)

正如其他人所说,它是一个lambda,它基本上是一个匿名(未命名)的本地函数。

如果你看一些不使用lambdas的类似代码,这可能会更有意义:

// With a lambda
private void OnFormLoad()
{
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
}

// Without a lambda
private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(ExecuteGetSqlData);
}

private void ExecuteGetSqlData()
{
    // If GetSqlData returns something, change this to "return GetSqlData();"
    GetSqlData();
}

至于其他代码,通常你不必做new Action。问题是BeginInvoke方法需要Delegate,这是一种老派,并且打破了大多数新代码的工作方式。

使用较新的代码(类似于Action或特定类型的委托,如WaitCallback),您可以编写lambda,或者只是在类中提供函数的名称。我上面写的示例代码演示了这两个代码。

另请注意,如果您看到类似(Action) (() => Blah())的内容,则与new Action(() => Blah())几乎相同。

答案 2 :(得分:4)

这些被称为lambda expressions,与C#中的代表没有什么不同。

()表示没有参数,(可选){}之间的区别是lambda表达式主体。 =>运算符只是将两个表达式关联在一起以生成lambda表达式。顺便说一下,它们常见于LINQ代码中。

new Action()没有什么特别之处,只是它是delegate可以将lambda表达式映射到自身。

对于ThreadPool.QueueUserWorkItem()WaitCallback参数是委托。您可以将命名委托的名称作为参数传递,传递匿名delegate对象或为此匿名delegate编写lambda表达式(在您的情况下为() => GetSqlData())。

答案 3 :(得分:2)