Lambda表达式的本质是一个匿名函数,Lambda表达式只能与委托配合使用,其优势在可以很方便的定义匿名方法。所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
1、表达式lambda语法
如果只有一个输入参数时,括号可以省略,如:(x) => x * x 等于 x => x * x
如果具有一个以上的输入参数,必需加上括号,如:(x, y) => x== y
可以显式指定输入参数的类型,如:(int x, strings) => s.Length > x
也可以没有任何输入参数,如:() => Console.WriteLine("无参数的Lambda表达式")
2、函数语法
语句写在大括号中,如:
Action<int, int> sum = (a, b) => { inti = a = +b; Console.Write(i); };
只有一条语句时,可以省略大括号“{}”,如:
Action<int, int> sum = (a, b) => Console.Write(a+ b);
当匿名方法有返回值时,可以使用return,如:
Func<int, int, string> sum0= (a, b) => { return "和是:" + (a + b); };
当匿名方法有返回值,且只有一条语句时,可以省略大括号“{}”和return,如:
Func<int, int, string> sum1= (a, b) => "和是:" + (a + b);
注意:当有返回值时,语句Lambda中使用了大括号就一定要使用return关键字返回;反之使用了return关键字返回结果就一定要使用大括号。即:return关键字与大括号必须同时省略!
3、lambda式中的变量和作用域
在Lambda式定义中可以引用外部变量。只要是在定义处能够访问到的变量,都可以在Lambda式中引用。所有会被引用的外部变量必须在Lambda式定义之前被显式赋值。
变量作用域的规则:
被“捕获”的变量在委托的生命周期结束前都不会被垃圾回收;
在Lambda式内部定义的变量对外不可见;
Lambda式无法直接捕获一个具有ref或out描述的参数变量;
Lambda式中的return语句不会导致当前所在的方法返回;
Lambda式中不允许包含会导致跳当前执行范围的goto,break 或 continue语句。