2010-12-20 109 views
7

我发现了一些新的C#语法,并不明白它的含义。下面是语法相关的代码:为什么我可以使用lambda表达式代替回调委托?

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失踪?请详细解释。

非常感谢。

+8

*()=> some_code *是一个lambda表达式,它只是编写匿名代理的捷径。我认为你的困惑是由太多的方式来实现相同的事情造成的。 – 2010-12-20 06:49:03

+0

@PauliØsterø:很好说:) – BoltClock 2010-12-20 06:53:19

+0

'ThreadPool.QueueUserWorkItem(()=> GetSqlData());'不会在我的测试应用程序中编译。您的项目使用哪种版本的.NET框架(或者至少VS的版本是什么)? – 2010-12-20 07:09:47

回答

6

看一看

Action Delegate

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

Lambda Expressions (C# Programming Guide)

lambda表达式是匿名 功能,可以包含表达式 和声明,并且可被用于创建 代表或表达式树 类型。

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

4

这些被称为lambda expressions,它们与C#中的代表并没有很大的不同。

空的()表示没有参数,并且(可选的){}之间的内容是lambda表达式体。 =>运算符只需将两个表达式关联在一起即可生成一个lambda表达式。另外,它们通常在LINQ代码中找到。

new Action()没什么特别的,只是它是一个delegate,它可以将lambda表达式映射到它自己。

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

+0

@加贝:呃,我现在编辑它。 – BoltClock 2010-12-20 07:49:45

5

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

这可能使更多的意义,如果你看一些类似的代码不使用lambda表达式:

// 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())几乎相同。

+0

感谢您的帮助;)。 – Thomas 2010-12-24 13:33:53

相关问题