介绍
Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 ,但是比匿名函数更简洁。
通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。
Lambda表达式本身可划分为两种类型:语句Lambda和表达式Lambda。
若要创建 Lambda 表达式,需要在 Lambda 运算符 => (goes to)左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。
格式
(input parameters) => expression
或者
(input parameters) => {statement;}
左边参数列表可以有多个参数,一个参数,或者无参数;参数类型可以隐式或者显式,参数类型可以忽略,因为可以根据使用的上下文进行推断而得到。
仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。
例如:
(x, y) => x * y //多参数,隐式类型=> 表达式
x => x * 10 //单参数,隐式类型=>表达式
x => { return x * 10; } //单参数,隐式类型=>语句块
(int x) => x * 10 //单参数,显式类型=>表达式
(int x) => { return x * 10; } //单参数,显式类型=>语句块
() => Console.WriteLine() //无参数
例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值。
Lambda表达式与委托类型
如下面的示例所示,你可以将此表达式分配给委托类型:
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
=> 运算符具有与赋值运算符 (=) 相同的优先级并且是右结合运算
使用 Lambda 表达式创建该委托最为方便。
Lambda表达式可以被转成委托类型,但必须满足以下几点:
1.两者参数个数相同
2.参数类型相同,注意隐式类型要参与类型辨析
3.委托的返回类型要与Lambda的相同,不论是表达式还是语句块
Lambda与匿名函数的对比:
public delegate int DelegateTest(int n1, int n2); static void Main(string[] args) { //委托:方法作为参数传递 var r1 = Result(3, 4, Sum); //使用匿名方法传递委托 var r4 = Result(3,4,delegate(int x,int y){return x+y;}); //语句lambda传递委托 var r2 = Result(3, 4, (a, b) => { return a - b; }); //lambda传递委托 var r3 = Result(3, 4, (a, b) => a * b); Console.ReadLine(); } public static int Result(int a, int b, DelegateTest @delegate) { return @delegate(a, b); } public static int Sum(int a, int b) { return a + b; }