一、匿名方法的引入
先写几个委托,后面的代码中会调用。
1 public delegate void DelegateM1(); 2 3 public delegate int DelegateM2(int n1,int n2); 4 5 public delegate int DelegateM3(int n);
我们每次在把方法赋值给委托变量的时候,需要编写一个方法,传给委托变量,代码如下:
直接写方法:
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 }
如果这个方法只是临时用一下,我们再单独把这个方法写下来,似乎没必要,这时候,我们在赋值的时候,直接声明一个匿名方法(无参无返回值):
1 DelegateM1 m1 = delegate () { Console.WriteLine("这是匿名方法"); };//匿名方法的关键字:delegate 2 3 m1();
从上面的代码,我们看出匿名方法的语法格式(关键字前面不能带类型,比如int等):
1 delegate (参数列表) { 方法体 }
有一个参数的和返回值的匿名方法:
1 DelegateM3 m3 = delegate (int n) { return n; }; 2 Console.WriteLine(m3(3));
有两个参数和返回值的:
1 DelegateM2 m2 = delegate (int n1, int n2) { return n1 + n2; }; 2 Console.WriteLine(m2(2,5));
用匿名方法虽然使用方便,但是使用起来,让人感觉怪怪的,接下来进一步简化,这就引出了lambda表达式。(可以先把关键字,参数的类型都省略掉。如果方法体只有一句return语句,只要写上return后面的代码即可)
无参无返回值:
1 DelegateM1 m1 = () => { Console.WriteLine("这是lambda表达式的M1方法"); }; 2 m1();
有一个参数有返回值:(可以省略参数类型)
1 DelegateM3 m2 = (int n) => { return n; }; 2 int m= m2(1); 3 Console.WriteLine(m);
这种情况还有进一步简化:
1 DelegateM3 m2 = n => n; 2 int m = m2(1); 3 Console.WriteLine(m);
有两个参数有返回值:(可以省略参数的类型,只要参数名称)
1 DelegateM2 m2 = (int n1, int n2) => { return n1 + n2; }; 2 Console.WriteLine(m2(1, 2));
也可以进一步简化:
1 DelegateM2 m2 = (n1,n2) => n1 + n2; 2 Console.WriteLine(m2(1, 2));