表达式Lambda与语句Lambda
本文关键字:Lambda 语句 表达式 | 更新日期: 2023-09-27 18:27:12
从根本上讲,单行表达式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需要语句lambda。此外,像LINQ to SQL这样的表达式提供程序不支持语句lambda。在.NET 4.0之前,.NET Framework不支持语句表达式树。这是在4.0中添加的,但据我所知,没有供应商使用它
Action myDelegate1 = () => Console.WriteLine("Test 1");
Expression<Action> myExpression = () => { Console.WriteLine("Test 2") }; //compile error unless you remove the { }
myDelegate1();
Action myDelegate2 = myExpression.Compile();
myDelegate2();
否则它们是一样的。
救援反射器!分解后的代码如下所示:
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<int, int, bool> foo = (x, y) => { return x == y; };
Func<int, int, bool> goo = (x, y) => x == y;
Personnaly,我更喜欢Lambda表达式。表达式有一个值,而语句没有。
我认为以下链接可以帮助你:
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;
从文档(https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions):
语句lambdas和匿名方法一样,不能用于创建表达式树。