繁体   English   中英

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

[英]Why can I use a lambda expression in place of a callback delegate?

我发现了一些新的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丢失了? 请详细解释。

非常感谢。

看一下

行动代表

封装具有单个参数但不返回值的方法。 您可以使用Action委托将方法作为参数传递,而无需显式声明自定义委托。

Lambda表达式(C#编程指南)

lambda表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型。

所有lambda表达式都使用lambda operator =>,它被读作“转到”。 lambda运算符的左侧指定输入参数(如果有),右侧包含表达式或语句块。 lambda表达式x => x * x被读为“x转到x乘以x”。

正如其他人所说,它是一个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())几乎相同。

这些被称为lambda表达式 ,与C#中的委托没有太大区别。

empty ()表示没有参数,(optional) {}之间的内容是lambda表达式主体。 =>运算符只是将两个表达式关联在一起以生成lambda表达式。 另外,它们常见于LINQ代码中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM