Lambda 表达式

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文导读:“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。所有 Lambda 表达式都使用 Lambda 运算符 =>。该Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。 lambda表达式使得函数可以在使用的地方声明,并且可以在lambda函数中使用lambda函数之外的数据。

一、lambda运算符

所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者“成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。

使用Lambda表达式,当编译器编译时,Lambda表达式同样会被编译成一个匿名方法进行相应的操作,但是与匿名方法相比,Lambda表达式更容易阅读。

比较Lambda表达式和匿名方法,在匿名方法中,"("、")"内是方法的参数的集合,这就对应了Lambda表达式中的"(参数列表)",而匿名方法中"{"、"}"内是方法的语句块,这对应了Lambda表达式中"=>"符号右边的表达式或语句块项。

二、lambda表达式语法

Lambda表达式可以有多个参数、一个参数,或者没有参数。

格式:

(参数列表)=>表达式或语句块

表现形式为

1.一个参数:param=>expr

2.多个参数:(param-list)=>expr

Lambda表达式的格式实例

1(x, y) => x * y //多参数,隐式类型=> 表达式

2x => x * 5 //单参数,隐式类型=>表达式

3x => { return x * 5; } //单参数,隐式类型=>语句块

4(int x) => x * 5 //单参数,显式类型=>表达式

5(int x) => { return x * 5; } //单参数,显式类型=>语句块

6() => Console.WriteLine() //无参数

三、Lambda表达式与匿名方法的对比实例

1、Sort方法

C# 代码复制

List list=new List();

var numbers = new []{ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

list.AddRange(numbers);

list.Sort(delegate (int a, int b)

{

return pareTo(b);

}

);

//use lambda list.Sort((a,b)=>pareTo(b));

2、ConvertAll方法

C# 代码复制

ListdoubleList =list.ConvertAll(delegate(int i)

{

return i*2;

});

//use lambda var doubleList2=list.ConvertAll(i=>i*2);

3、FindAll方法

C# 代码复制

ListlowerThanFiveList =list.FindAll(delegate(int i)

{

return i<5;

}

);

//lambda var lowerThanFiveList2=list.FindAll(i=>i<5);

四、Lambda表达式注意事项

下列规则适用于 Lambda 表达式中的变量范围:

1、捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。

2、在外部方法中看不到 Lambda 表达式内引入的变量。

3、Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。

4、Lambda 表达式中的返回语句不会导致封闭方法返回。

5、Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。

6、Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”

7、在 is 或 as 运算符的左侧不允许使用 Lambda。

8、适用于匿名方法的所有限制也适用于 Lambda 表达式。

相关文档
最新文档