欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#中Lambda表达式演化过程解析及相关注意事项

程序员文章站 2022-06-02 11:41:06
...

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("你好"); 

注意事项:

  1. Lambda表达式左边的输入参数列表必须在个数、类型位置上与委托类型相匹配。
  2. 若方法体中存在return语句时,则花括号{ }不可以省略。
  3. 若指定有0个输入参数,则需要用空括号( )表示,即:( ) => { Console.WriteLine(“你好”); }。
  4. 如果编译器无法推出类型,则可以显示地指定类型,即:( 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);};