What does () => mean in C#?
我一直在阅读MOQ的源代码,我遇到了以下单元测试:
1 | Assert.Throws<ArgumentOutOfRangeException>(() => Times.AtLeast(0)); |
在我的一生中,我记不起()到底做了什么。我认为这与匿名方法或lambda有关。我肯定我知道它是干什么的,我现在记不起来了……
更糟的是……谷歌没有太多帮助,StackOverflow也没有。
有人能给我一个很正常的问题的快速答案吗?
在StackOverflow中搜索"lambda"。
明确地:
1 | () => Console.WriteLine("Hi!"); |
这意味着"一个不带参数并返回void的方法,当您调用它时,它会将消息写入控制台。"
您可以将其存储在操作变量中:
1 | Action a = () => Console.WriteLine("Hi!"); |
然后你可以称之为:
2()=>是空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" |
它是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提供了这个链接来回答你的问题!!!!