繁体   English   中英

表达式Lambda与语句Lambda

[英]Expression Lambda versus 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,您需要语句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"); 
};

括号为必填项。

如果委托返回一个值, return是必要的声明拉姆达如下。

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

从个性上讲,我更喜欢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://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions ):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM