Lambda表达式为匿名方法提供了一个新的语法。
匿名方法就是没有方法名称的方法,可以将委托与匿名方法关联,即直接给出方法体。
以下是Lambda表达式演化过程:
//声明委托类型
public delegate void SayHandler(string name, int age);
//原始形态
SayHandler handler1=new SayHandler(
delegate(string name, int age){ Console.WriteLine("你好"); }
);
//进化1 直接去掉:new SayHandler( )
SayHandler handler2=delegate(string name, int age){ Console.WriteLine("你好"); }
//进化2 delegate去掉后,换上了一个符号“=>”,读作:goes to
SayHandler handler3=(string name, int age)=>{ Console.WriteLine("你好"); }
//进化3 因为与委托类型是一一对应关系,所以直接去掉参数类型名称
SayHandler handler4=(name, age)=>{ Console.WriteLine("你好"); }
//进化4 匿名方法只有一行代码,则花括号{} 可省略
//注:若参数列表中只有一个参数,则圆括号() 也可省略
SayHandler handler5=(name, age)=> Console.WriteLine("你好");
注意事项:
- Lambda表达式左边的输入参数列表必须在个数、类型和位置上与委托类型相匹配。
- 若方法体中存在return语句时,则花括号{ }不可以省略。
- 若指定有0个输入参数,则需要用空括号( )表示,即:( ) => { Console.WriteLine(“你好”); }。
- 如果编译器无法推出类型,则可以显示地指定类型,即:( int x, int y) => x+y;
以下语句是错误的:
delegate int mydelegate(int x);
mydelegate p1=(int x)=> return(x+1); //return语句应包含在花括号中
mydelegate p2= x => x++; //x没有变,应改为++x;
mydelegate p3= (ref x) => ++x; //输入参数不是ref类型
mydelegate p4= (out x) => ++x; //输入参数不是out类型
mydelegate p5= (x, y) => { int z=x*y; z+1;};
//应改为:mydelegate p5= (x, y) => { int z=x*y; return(z+1);};