关于c#3.0:()=>

What does () => mean in C#?

我一直在阅读MOQ的源代码,我遇到了以下单元测试:

1
Assert.Throws<ArgumentOutOfRangeException>(() => Times.AtLeast(0));

在我的一生中,我记不起()到底做了什么。我认为这与匿名方法或lambda有关。我肯定我知道它是干什么的,我现在记不起来了……

更糟的是……谷歌没有太多帮助,StackOverflow也没有。

有人能给我一个很正常的问题的快速答案吗?

  • 记得我在SQL中查找"*="信息时…不是最适合搜索引擎的操作员…
  • 如果我理解正确,这意味着如果times.at(0)为false,那么会抛出一些异常。我说的对吗?这只能在"调试"模式下工作吗?


在StackOverflow中搜索"lambda"。

明确地:

1
() => Console.WriteLine("Hi!");

这意味着"一个不带参数并返回void的方法,当您调用它时,它会将消息写入控制台。"

您可以将其存储在操作变量中:

1
Action a = () => Console.WriteLine("Hi!");

然后你可以称之为:

2

  • 不是我,但可能是因为"lambda的搜索堆栈溢出"并不是很有用,因为OP承认他知道这与lambda有关。+不过,是我的。
  • 在你扩大你最初的答案之前,可能有人投了反对票。不过,现在看看你的答案,肯定是非常有帮助的。
  • @Earwicker:好像你没有足够的代表:p
  • 出于某种原因,我认为你不允许在你回答的问题上投票。我从哪里得到这个主意的:p
  • 起初我投了反对票。"你必须搜索这个,这个"不是一个有用的答案。如果你也提供了一个链接到搜索和最重要的结果,我认为它是有帮助的。当然,现在,我的投票率下降了。


()=>是空lambda表达式。它表示传递给assert.throws的匿名函数,并在该函数内部的某个位置调用。

1
2
3
4
5
6
7
8
void DoThisTwice(Action a) {
    a();
    a();
}
Action printHello = () => Console.Write("Hello");
DoThisTwice(printHello);

// prints"Hello Hello"

  • 那么,本质上,单元测试代码正在创建一个匿名方法,该方法调用一个方法,然后由throws方法执行,该方法处理抛出的异常,并断言抛出了正确的异常?
  • 对。…………………


它是lambda表达式。最常见的语法是使用参数,因此它周围不需要括号:

1
n => Times.AtLeast(n)

如果参数的数目不是一个,则需要括号:

1
(n, m) => Times.AtLeast(n + m)

当参数为零时,使用空参数列表周围的括号可以得到有点笨拙的语法:

1
() => Times.AtLeast(0)

  • 啊……这很有道理!谢谢!


1
() => Times.AtLeast(0)

()表示lambda函数没有参数或返回值。

=>表示要跟随一个代码块。

Times.Atleast(0)至少使用参数0调用Times类的静态方法。


这是lambda(匿名)函数的定义。本质上,这是一种内联定义函数的方法,因为assert.throws将函数作为参数并尝试运行它(然后验证它是否引发了某个异常)。

基本上,您所拥有的代码片段有一个单元测试来确保时间。至少(0)会抛出ArgumentOutOfRangeException。lambda函数是必要的(而不是仅仅从assert.throws直接调用times.at函数),以便传递测试的正确参数-在本例中为0。

有关此处主题的msdn-kb文章:http://msdn.microsoft.com/en-us/library/bb882516.aspx


我不会用C语言编程,但是谷歌"C"lambda提供了这个链接来回答你的问题!!!!