匿名方法

一、匿名方法的引入

先写几个委托,后面的代码中会调用。

1 public delegate void DelegateM1();
2 
3     public delegate int DelegateM2(int n1,int n2);
4 
5     public delegate int DelegateM3(int n);
View Code

我们每次在把方法赋值给委托变量的时候,需要编写一个方法,传给委托变量,代码如下:

直接写方法:

 1 DelegateM1 m1 = M1;
 2             //反编译后等价于 DelegateM1 m1 = new DelegateM1(M1);就是说委托变量只能接受委托对象,我们把方法赋值给委托,其实内部是把方法作为委托的参数传了进去
 3 
 4             m1();//调用委托的时候,写成方法的形式,实际上是调用委托的 m1.Invoke();方法
 5 
 6 
 7 
 8 
 9 static void M1()
10         {
11             Console.WriteLine("这是方法M1");
12         }
View Code

如果这个方法只是临时用一下,我们再单独把这个方法写下来,似乎没必要,这时候,我们在赋值的时候,直接声明一个匿名方法(无参无返回值):

1 DelegateM1 m1 = delegate () { Console.WriteLine("这是匿名方法"); };//匿名方法的关键字:delegate
2 
3             m1();
View Code

从上面的代码,我们看出匿名方法的语法格式(关键字前面不能带类型,比如int等):

1 delegate (参数列表) { 方法体 }
View Code

有一个参数的和返回值的匿名方法:

1 DelegateM3 m3 = delegate (int n) { return n; };
2             Console.WriteLine(m3(3));
View Code

有两个参数和返回值的:

1 DelegateM2 m2 = delegate (int n1, int n2) { return n1 + n2; };
2             Console.WriteLine(m2(2,5));
View Code

 用匿名方法虽然使用方便,但是使用起来,让人感觉怪怪的,接下来进一步简化,这就引出了lambda表达式。(可以先把关键字,参数的类型都省略掉。如果方法体只有一句return语句,只要写上return后面的代码即可)

无参无返回值:

1 DelegateM1 m1 = () => { Console.WriteLine("这是lambda表达式的M1方法"); };
2             m1();
View Code

有一个参数有返回值:(可以省略参数类型)

1 DelegateM3 m2 = (int n) => { return n; };
2             int m= m2(1);
3             Console.WriteLine(m);
View Code

这种情况还有进一步简化:

1 DelegateM3 m2 =  n => n;
2             int m = m2(1);
3             Console.WriteLine(m);
View Code

有两个参数有返回值:(可以省略参数的类型,只要参数名称)

1  DelegateM2 m2 = (int n1, int n2) => { return n1 + n2; };
2             Console.WriteLine(m2(1, 2));
View Code

也可以进一步简化:

1 DelegateM2 m2 = (n1,n2) => n1 + n2;
2             Console.WriteLine(m2(1, 2));
View Code

 

posted @ 2017-04-27 15:12  wesley1680  阅读(172)  评论(0编辑  收藏  举报