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

Tho*_*mas 8 .net c# syntax

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

1)

BeginInvoke(new Action(() =>
    {
        PopulateUI(ds);
    }));
Run Code Online (Sandbox Code Playgroud)

2)

private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
}
Run Code Online (Sandbox Code Playgroud)

是什么意思new Action(),什么是意义=>符号?

语法ThreadPool.QueueUserWorkItemThreadPool.QueueUserWorkItem(new WaitCallback(PrintOut), "Hello");,但在这里显示ThreadPool.QueueUserWorkItem(() => GetSqlData());,所以它是如何工作的?为什么WaitCallback失踪?请详细解释.

非常感谢.

Adr*_*der 7

看一下

行动代表

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

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

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

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


Mer*_*ham 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();
}
Run Code Online (Sandbox Code Playgroud)

至于其他代码,通常你不应该这样做new Action.问题是该BeginInvoke方法需要a Delegate,这是一种旧学校,并打破了大多数新代码的工作方式.

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

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