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<>
标签:函数,列表,参数,类型,表达式,Lambda From: https://blog.csdn.net/javajjij/article/details/140872752