Lambda 表达式剖析

C# 3.0(.NET 3.5) 与 LINQ 一起引入了 lambda 表达式。 lambda 表达式是使用一些特殊语法表示匿名方法的一种更短的方式。 (js里把它叫箭头函数,两个是类似的东西)

例如,以下匿名方法检查学生是否为青少年:

public class Student
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int Age { get; set; }
}
static void Main(string[] args)
{
    Predicate<Student> predicate = delegate (Student s) { return s.Age > 12 && s.Age < 20; };
}

上述匿名方法可以使用 C# Lambda 表达式表示如下:

class Program
{
    static void Main(string[] args)
    {
        Predicate<Student> predicate = s => s.Age > 12 && s.Age < 20; 
    }
}

lambda的演化过程

让我们看看 lambda 表达式是如何从以下匿名方法演变而来的

匿名方法

delegate (Student s) { return s.Age > 12 && s.Age < 20; };

Lambda 表达式是从匿名方法演变而来,首先删除了委托关键字和参数类型,并添加了一个 lambda 运算符 =>。

static void Main(string[] args)
{
    Predicate<Student> predicate = delegate (Student s) { return s.Age > 12 && s.Age < 20; };
    // 把 delegate 去掉了 加入了 => 关键的一步。换了一种表达方式而已
    Predicate<Student> predicate2 = (Student s) => { return s.Age > 12 && s.Age < 20; };
    // 把类型去掉了。因为是可以推断出来的。
    Predicate<Student> predicate3 = (s) => { return s.Age > 12 && s.Age < 20; };

    //因为只有一个语句,所以 return 和大括号也可以被省略
    Predicate<Student> predicate4 = (s) =>  s.Age > 12 && s.Age < 20;

    // 因为只有一个参数所以 括号也可以补省略
    Predicate<Student> predicate5 = s => s.Age > 12 && s.Age < 20;
}

因此,我们得到了 lambda 表达式: s => s.Age > 12 && s.Age < 20 其中 s 是一个参数, => 是 lambda 运算符, 而 s.Age > 12 && s.Age < 20 是主体表达式 :

lambda多个参数

//类型参数可以省是因为左边有定义了,所以推断得出来
Func<Student, int, bool> func = (s, minAge) => { return s.Age > minAge && s.Age < 20; };

lambda 无参

一个 lambda 表达式中没有必要至少有一个参数。 也可以不带任何参数指定 lambda 表达式。

Action action = () => Console.WriteLine("hello world");

lambda 多个语句

大括号和 return 不能省略了

Predicate<Student> predicate6 = (s) =>
{
    s.Age += 10;
    return s.Age > 12 && s.Age < 20;
};

lambda 表达式里定义变量

Predicate<Student> predicate7 = (s) =>
{
    var maxAge = 20;
    return s.Age > 12 && s.Age < maxAge;
};

lambda 表达式使用外部的变量

 var maxAge = 20;
Predicate<Student> predicate8 = (s) =>
{
    return s.Age > 12 && s.Age < maxAge;
};

有了这个之后我们基本上不会按匿名方法的方式来写代码了。

要记住的要点:

  • Lambda 表达式是表示匿名方法的一种更短的方式。
  • Lambda 表达式语法:参数 => 主体表达式
  • Lambda 表达式可以有零个参数。
  • Lambda 表达式可以在括号 () 中包含多个参数。
  • Lambda 表达式可以在大括号 中的主体表达式中包含多个语句。
  • Lambda 表达式可以分配给 Func、Action 或 Predicate 委托。
  • 可以以类似于委托的方式调用 Lambda 表达式。
上一篇:C# 匿名方法
下一篇:C# 事件event
最近更新的
...