Expression Lambda vs Statement Lambda

时间:2012-03-09 15:17:47

标签: c# 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();
}

虽然我更喜欢第一个,因为我发现括号很难看,两者之间是否有任何不同之处(除了需要括号用于多行语句的明显部分之外)?

8 个答案:

答案 0 :(得分:15)

你需要多语句lambda的语句lambda。另外,LINQ to SQL等表达式提供程序不支持语句lambdas。在.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();

否则它们是相同的。

答案 1 :(得分:10)

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

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

所以不,两者之间没有真正的区别。快乐。

答案 2 :(得分:8)

两者是相同的 - 第一个是syntactic sugar到第二个,两个都将编译到同一个IL。

答案 3 :(得分:4)

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

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

括号是强制性的。

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

就个人而言,我更喜欢Lambda Expression。 Expression具有Statement所不具有的值。

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

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

答案 6 :(得分:0)

与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;

答案 7 :(得分:0)

从文档(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions):

语句lambda与匿名方法一样,不能用于创建表达式树。