当前位置:坤哥网-kungge-从委托、匿名方法到Lambda

从委托、匿名方法到Lambda

2015/9/6 23:34:00 坤哥网阅读(960) 评论(0)

前面讲过委托的知识,本次由委托过渡到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); 
View Code

委托

其中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语句,则必须使用圆括号'()',如果是有多个参数也必须使用圆括号。
分类: C#

有话要说? =>【不用注册,直接登录】,然后刷新本页面来发表您的观点(●'◡'●)