[英]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表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型。
所有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.