我发现了一些新的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.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();
}
Run Code Online (Sandbox Code Playgroud)
至于其他代码,通常你不应该这样做new Action.问题是该BeginInvoke方法需要a Delegate,这是一种旧学校,并打破了大多数新代码的工作方式.
使用更新的代码(类似于Action或类似的委托类型WaitCallback),您可以编写lambda,或者只是在类中提供函数的名称.我上面写的示例代码演示了这两个.
另请注意,如果您看到类似于:的内容(Action) (() => Blah()),则几乎相同new Action(() => Blah()).