"()=>"的目的是什么?

10

我在大学的编程课中没有真正接触过这种语法,我很好奇它的含义。

唯一需要使用它的时候是:

  1. 当我需要创建一个必须添加到 ProgressChanged 事件的 BackgroundWorker

    Invoke((MethodInvoker)(() => updatePing((int) e.UserState)));

  2. 当研究使用 Caliburn.Micro MVVM 框架的教程时

    NotifyOfPropertyChange(() => Count);

我尝试过搜索这种符号的含义,但它使用的特殊字符会影响谷歌搜索,而我不知道它叫什么名字。


4
它介绍了一个无参数 lambda 表达式(可以转换为无参数的 ActionFunc<T> 委托,取决于其内容)。它基本上是创建匿名函数的简写方式(尽管实际上比这更强大)。在此处阅读有关它们的信息:http://msdn.microsoft.com/en-us/library/bb397687.aspx。 - dlev
啊,原来如此,我不知道它被称为lambda表达式,搜索“=>”也没有任何结果。 - clifford.duke
搜索 "=>" 可以正常工作。 - H H
2个回答

22

=>是表示lambda表达式的语法。

()表示没有参数 - 如果有参数并且类型可以从上下文中推断出来,可以像这样指定:

(x, y) => x + y

或者显式地指定类型

(int x, string y) => x + y.Length

如果只有一个参数且其类型可以被推断出来,那么您不需要使用括号:

x => x.Length

10

这是一个没有参数的lambda表达式。

实际上,你所做的是将一个代表方法的delegate(类似于方法的变量)传递给你的函数。


() => Count表示一个类似于以下方法的方法。

type methodName()
{
    return Count;
}

14
你被打中了。 - Richard J. Ross III
1
那么 () => Count 和直接传递 Count 之间有什么区别呢? - clifford.duke
3
如果在传递委托之后,但在实际调用委托之前更改了Count的值,那么这很重要。如果你只是传递了 Count,那么它将返回你传递时的计数值。请注意,此处只提供翻译,不包括任何解释,并尽可能使原意保持不变。 - Sam I am says Reinstate Monica
它还可以让您执行更复杂的逻辑。例如,如果您将lambda传递给的方法是异步的,那么lambda表达式可以表示整个回调函数,就像这样:doSomeExpensiveAsyncMethod(x, y, () => dialog.TellUserThatOperationIsFinished()) - Kevin
有趣的是,Jon Skeet的出现似乎吸引了更多的流量到这个问题中,导致我的答案得到了比如果他没有在这里发帖时更多的赞同。 - Sam I am says Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接