委托、匿名方法、Lambda表达式

1.匿名方法

  没有具体名称,只有委托关键字、方法参数、方法体,所以称之为匿名方法

  匿名方法允许将代码块(方法体部分)通过委托变量作为参数传递,以代替独立定义的方法

  总结:

  方法体要以delegate开头,其后是参数列表,后面紧跟花括号编写方法体,最后以分号结尾

  匿名方法是将方法定义与委托变量两个步骤合在一起,省略了方法的单独定义

  如果一个方法有一个委托类型的参数,可以直接将匿名方法作为实参。

 1         //声明委托
 2         public delegate int MyDelegate(int a, int b);
 3 
 4         static void Main(string[] args)
 5         {//匿名方法
 6             MyDelegate objDel = delegate (int a, int b)
 7             {
 8                 return a + b;
 9             };
10             Console.WriteLine(objDel(10, 20));
11             Console.ReadLine();
12         }
匿名方法

2.lambda表达式

  C#3.0引入lambda表达式,lambda表达式是匿名方法更简介使用的一种方式

  (参数列表) => {方法体}  =>读作goes to

  lambda表达式参数列表中的参数类型可以是“明确”类型或者是“推断类型”(可以省略参数类型)

  如果是推断类型,参数数据类型将由编译器根据上下文自动推断出来

  一般情况下还是写参数类型的好,方便自己和他人理解

  如果参数只有一个可以省略();如果方法体只有一行代码可以省略{}

3.lambda表达式总结

  两种方式:(input args)=>表达式          (input args)=>{语句1;语句2;......}

  举例1:只有一个参数的时候,括号可选   Func<int,bool> del1=(x)=>{return x>0;};

  举例2:可简化为   Func<int,bool> del2=x=>x>0;

  举例3:两个或更多输入参数由逗号分隔    Func<int,int,bool> del3=(x,y)=>x==y;

  举例4:没有参数时,直接输入一个空的括号  Action del4=()=>{...}

 1         //声明委托
 2         public delegate int MyDelegate(int a, int b);
 3         static void Main(string[] args)
 4         {
 5             //一条语句未省略{}
 6             MyDelegate objDel0 = (int a, int b) => { return a + b; };
 7             //一条语句省略{}
 8             MyDelegate objDel1 = (int a, int b) => a + b;
 9             Console.WriteLine(objDel0(10, 20));
10             Console.WriteLine(objDel1(10, 20));
11             Console.ReadLine();
12         }
Lambda表达式

4.lambda与匿名方法比较

  Lambda表达式本身就是匿名方法

  Lambda表达式的参数可以允许不指明参数类型,而匿名方法的参数必须明确指明参数类型

  Lambda表达式方法体允许由单一表达式或多条语句组成,而匿名方法不允许单一表达式形式

猜你喜欢

转载自www.cnblogs.com/yangmengke2018/p/10939667.html