表达Lambda与Statement Lambda

从根本上说,单行表达式lambda和语句lambda之间有什么区别吗? 请使用以下代码,例如:

private delegate void MyDelegate(); protected static void Main() { MyDelegate myDelegate1 = () => Console.WriteLine("Test 1"); MyDelegate myDelegate2 = () => { Console.WriteLine("Test 2"); }; myDelegate1(); myDelegate2(); Console.ReadKey(); } 

虽然我更喜欢第一个,因为我发现括号是丑陋的,两者之间是否有任何不同(除了要求多行语句括号的明显部分)?

你需要语句lambda for multistatement lambdas。 另外,LINQ to SQL等表达式提供程序不支持语句lambdas。 在.NET 4.0之前,.NET Framework不支持语句表达式树。 这是在4.0中添加的,但据我所知,没有提供商使用它。

 Action myDelegate1 = () => Console.WriteLine("Test 1"); Expression myExpression = () => { Console.WriteLine("Test 2") }; //compile error unless you remove the { } myDelegate1(); Action myDelegate2 = myExpression.Compile(); myDelegate2(); 

否则他们是一样的。

reflection器救援! 反汇编的代码如下所示:

 private static void Main(string[] args) { MyDelegate myDelegate1 = delegate { Console.WriteLine("Test 1"); }; MyDelegate myDelegate2 = delegate { Console.WriteLine("Test 2"); }; myDelegate1(); myDelegate2(); Console.ReadKey(); } 

所以不,两者之间没有真正的区别。 要开心。

两者是相同的 – 第一个是第二个语法糖 ,两个都将编译到同一个IL。

不,这个例子没有区别。 如果lambda的主体只有一个表达式,则可以删除括号。 但是,一旦lambda包含多个表达式,就像这样:

 MyDelegate myDelegate2 = () => { Console.WriteLine("Test 2"); Console.WriteLine("Test 2"); }; 

括号是强制性的。

如果委托返回一个值,则在语句lambda中return如下所示。

  Func foo = (x, y) => { return x == y; }; Func goo = (x, y) => x == y; 

Personnaly,我更喜欢Lambda Expression。 Expression具有Statement不具有的值。

我认为以下链接可以帮助您:

http://lambda-the-ultimate.org/node/1044

对于OP示例也是如此,但在C#6.0之后,允许您使用相同的表达式语法在类中定义普通的非lambda方法。 例如:

 public static double AreaOfTriangle(double itsbase, double itsheight) { return itsbase * itsheight / 2; } 

仅当方法可以转换为单个表达式时,才能编写上面的代码片段 简而言之,它可以使用表达式lambda语法,但不能使用语句lambda语法。

 public static double AreaOfTrianglex(double itsbase, double itsheight) => itsbase * itsheight / 2;