Lambda表达式

Lambda有很多叫法:Lambda表达式、Lambda函数、匿名函数。Lambda是一种定义匿名函数对象的简洁方式,可以接受参数、存储状态、返回值以及跨越多行。

语法定义:

【捕获列表】【参数列表】【可变规则】 【返回类型】【函数体】

[capture list] [parameters] [mutable throw()] -> return-type { statement}

【异常说明】

(参数列表) => {

//函数体

};

捕获列表:规范称之为Lambda导入器,捕获列表总是出现在Lambda函数的开始处。实际上,[]是Lambda引出符。捕获列表能捕获上下文中的变量供Lambda函数使用。

参数列表:与普通函数的参数列表一致。如不需要传递则可连同括号一起省略。

可变规则:mutable修饰符,默认情况下Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略。(参数不能为空)。

异常说明:用于Lamdba表达式内部函数抛出异常。

返回类型: 追踪返回类型形式声明函数的返回类型。可在不需要返回值的时候连同 ->一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。

Lambda函数体: 内容与普通函数一样,不过除了可以使用函数之外,还可以使用所有捕获的变量。

Lambda表达式有几种不同的形式。例如:语句Lambda由形参列表、Lambda操作符=>和代码块组成;表达式Lambda比语句Lambda更进一步,它只包含要返回的表达式,完全没有语句块。

Lambda表达式的注意事项和例子

Lambda表达式本身没有类型,所以,没有能直接从式中访问的成员,连object也没有string s = ((int x) => x).ToString();
由于Lambda表达式没有类型,所以不能出现在is操作符的左侧bool b = ((int x) => x) is Fun<int,int>
Lambda表达式只能转换成兼容委托类型。Func<int,bool> f = (int x) => x;
Lambda表达式没有类型,所以不能用于推断局部变量的类型var v = x => x;
C#不允许在Lambda表达式内部使用跳转语句(break,goto,continue)跳转到Lambda表达式外部;反之亦然。string[] args; Func<string> f; switch(args[0]) { case "/File": f = () => { if(!File.Exists(args[1]) break; return args[1])};}
对于一个Lambda表达式引入的参数和局部变量,其作用域仅限于Lambda主体Func<int,int,bool> expression = (first,second) => first > second; first++;
编译器的确定性赋值分析机制在Lambda表达式内部检测不到外部局部变量进行初始化的情况

闭包

闭包是一种语言特性,它允许在函数内部定义的函数访问外部的局部变量。即使外层函数执行已终止。在C#中我们可以使用Lambda来实现闭包。

委托

为增强灵活性和减少重复代码,可将方法作为参数传递给另一个方法,而方法要作为参数进行传递就需要一个能表示方法的数据类型,这个数据类型就叫委托。常规的委托类型有:Func<> 、Action<>

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值