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 }
4.lambda与匿名方法比较
Lambda表达式本身就是匿名方法
Lambda表达式的参数可以允许不指明参数类型,而匿名方法的参数必须明确指明参数类型
Lambda表达式方法体允许由单一表达式或多条语句组成,而匿名方法不允许单一表达式形式