进阶系列(8)——匿名方法与lambda表达式
一 匿名方法的介绍
匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础。在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建具名方法,从而用匿名方法更为方便。
二 匿名方法的使用场景
1 声明委托变量时作为初始化表达式
2 组合委托时赋值语句的右边
3 为委托增加事件时赋值语句的右边
三 匿名方法的定义
匿名方法是在初始化委托时内联声明的方法
Delegate (参数列表){语句块}
(一)返回值
匿名方法不会显示声明返回值。如果委托有void类型的返回值,匿名方法就不能有返回值
(二)参数
以下情况,我们可以使圆括号为空或省略圆括号来简化匿名方法的参数列表(两项同时成立)
1 委托的参数列表不包含任何out参数
2 匿名方法不使用任何参数
(三)params参数
如果声明委托的参数列表包含了params参数,那么params关键字在匿名方法的参数列表中就会被省略
四 匿名方法的变量和参数的作用域
1 参数以及声明在匿名方法内部的局部变量的作用域限制在实现方法的主体之内
2 与委托的具名方法不同,匿名方法可以访问它们外围作用域的局部变量和环境,方法中的代码可以访问外围变量并且输入它
五 lambda表达式简介
lambda表达式是比匿名方法更简洁的一种匿名方法语法。
lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫它,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。
lambda表达式:
1.一个参数:param=>expr
2.多个参数:(param-list)=>expr
六 匿名方法转换为lambda表达式的步骤
1 删除delegate关键字
2 在参数列表和匿名方法主体之间放lambda运算符=>.lambda运算符读作goes to
七 简化lambda表达式
1 编译器还可以从委托的声明中知道委托参数的类型,因此lambda表达式允许我们省略类型参数。
带有类型的参数列表称为显示类型
省略类型的参数列表称为隐式类型
2 如果只有一个隐式类型参数,我们可以省略周围的括号
3 lambda表达式允许表达式的主体是语句块或者表达式。如果语句块包含了一个返回语句,我们可以将语句块替换为return关键字后的表达式(即 去掉关键字return)
八 例子:
namespace 匿名方法和lambad表达式
{
delegate int MyDelegate(int x); //声明一个委托
class Program
{
public static int Add(int x) //实现委托的方法
{
return x + 20;
}
static void Main(string[] args)
{
MyDelegate del = delegate (int x){ return x + 20;};//匿名方法
MyDelegate del1 = (int x) =>{ return x + 20; }; //lambad表达式 变形1:去掉delegate关键字
MyDelegate del2 = (x) => { return x + 20; }; //lambad表达式 变形2:去掉参数类型
MyDelegate del3 = x => x + 20; //lambad表达式 变形3:去掉参数括号和return关键字
Console.WriteLine("两个数的和为{0}", del3(20));
Console.ReadLine();
}
}
}
九 lambda表达式的注意事项