前面讲过委托的知识,本次由委托过渡到Lambda表达式,更易于理解。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int[] intA = { 1, 3, 5, 7 }; 6 ProcArray(intA, AddOne); 7 foreach (int i in intA) 8 { 9 Console.Write(i + " "); 10 } 11 12 Console.ReadKey(); 13 } 14 private static void ProcArray(int[] intArra, ProcIntArrayHandler procHandler) 15 { 16 for (int i = 0; i < intArra.Length; i++) 17 { 18 intArra[i] = procHandler(intArra[i]); 19 } 20 } 21 22 private static int AddOne(int procNum) 23 { 24 return procNum + 1; 25 } 26 private static int AddTwo(int procNum) 27 { 28 return procNum + 2; 29 } 30 } 31 public delegate int ProcIntArrayHandler(int procNum);
委托
其中ProcIntArrayHandler是委托类型,表示处理一个整数,并返回对该整数处理的结果。在ProcArray方法中,可用procHandler参数所引用的实例来处理数组中的每个int元素。
注:委托是引用类型,不必用new实例化。
在c#1.0中,需要委托实例化,如:ProcArray(intA, new ProcIntArrayHandler(AddTwo));该语法在c#高版本中仍支持。
匿名方法
c#2.0引入了匿名方法,使用了较简洁的语法创建委托,如:ProcArray(intA, delegate(int i) { return i + 20; });
Lambda
由以上代码可知,是将AddOne和AddTwo转换成委托类型,它们的参数类型与返回类型是和委托类型兼容,
我们注意到private static int AddOne(int procNum)的声明比方法主体return procNum + 1;冗长多了,仅仅只是为了转成委托类型。
c#3.0引入Lambda表达式,语法更简单,如:ProcArray(intA, (int i) => i + 10);
lambda语句组成:形参=>代码块。改语句包含了AddOne方法的大多数信息: 形参和代码块,方法名称和修饰符省略了。没有方法名,所以匿名方法和lambda表达式都称为匿名函数。
由于编译器能检查出参数类型和返回值,故还可以再次省略:如ProcArray(intA,i=>i+10);
注:如果是个无参数Lambda语句,则必须使用圆括号'()',如果是有多个参数也必须使用圆括号。