【问题标题】:Expression Lambda versus Statement Lambda表达式 Lambda 与语句 Lambda
【发布时间】:2019-05-10 07:31:24
【问题描述】:

从根本上说,单行表达式 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();
}

虽然我更喜欢第一个,因为我觉得括号很难看,但两者之间有什么不同(除了多行语句需要括号的明显部分)?

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    对于多语句 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();
    

    否则它们是相同的。

    【讨论】:

      【解决方案2】:

      反射器来救援!反汇编代码如下:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          不,这个例子没有区别。如果 lambda 的主体只是一个表达式,则可以去掉括号。但是,一旦 lambda 包含多个表达式,如下所示:

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

          括号是强制性的。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

            • 除了多个语句之外,return 关键字的存在也是另一个事实。 +1
            【解决方案6】:

            就个人而言,我更喜欢 Lambda 表达式。表达式具有语句没有的值。

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

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

            【讨论】:

              【解决方案7】:

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

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

              上面的代码sn-p可以写成只有方法可以变成单个表达式。总之,可以用表达式lambda语法,但不能用statement lambda语法。

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-02-24
                  • 2019-09-19
                  • 1970-01-01
                  • 2011-03-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多