我发现了一些新的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
丢失了?请详细解释。
非常感谢。
答案 0 :(得分:6)
看看
封装具有的方法 单个参数并且不返回 值。您可以使用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)