c#之Lambda表达式
前面我们学习了委托,那么委托与Lambda表达式之间又有什么关系呢?
一、Lambda表达式
我们来看一段代码:
public delegate void NoReturnWithPara(string name, DateTime now); public class LambdaShow { public static void Show() { NoReturnWithPara method = new NoReturnWithPara(Study);//委托实例化,要求传入的方法必须满足委托的约束 method.Invoke("jack",DateTime.Now); } private static void Study(string name,DateTime now) { Console.WriteLine("{0}{1}正在学习Lambda表达式",name,now); } }
上面一段代码是用委托的形式表现的。接下来我们用Lambda表达看看是怎样的。
public delegate void NoReturnWithPara(string name, DateTime now); public class LambdaShow { public static void Show() { NoReturnWithPara method10 = (s, b) => Console.WriteLine("{0}{1}正在学习Lambda表达式", s, b); method10.Invoke("jack", DateTime.Now); } private static void Study(string name,DateTime now) { Console.WriteLine("{0}{1}正在学习Lambda表达式",name,now); } }
这两段代码的输出结果是一模一样的。
那么从第一段变成第二段到底是怎样一个过程呢?接下来我们来看看:
1、将具体的方法变成匿名方法
NoReturnWithPara method1 = new NoReturnWithPara( delegate(string name,DateTime now) { Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now); }); method1.Invoke("jack", DateTime.Now);
2、Lmabda表达式 把delegate换成=>
NoReturnWithPara method2 = new NoReturnWithPara( (string name, DateTime now)=> { Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now); });//Lmabda表达式 把delegate换成了=> method2.Invoke("jack", DateTime.Now);
3、去掉了参数类型,因为”委托实例化要求传入的方法必须满足委托的约束“
NoReturnWithPara method3 = new NoReturnWithPara( (name, now) => { Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now); }); method3.Invoke("jack", DateTime.Now);
4、去掉new NoReturnWithPara();
NoReturnWithPara method4 = (name, now) => { Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now); }; method4.Invoke("jack", DateTime.Now);
5、方法体只有一行,我们可以去掉{}。
NoReturnWithPara method5 = (name, now) => Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now); method5.Invoke("jack", DateTime.Now);
Lambda表达式就是这样来的。
二、系统自带的各种委托
其实我们在开发中,基本是不需要声明委托的,框架为我们提供了一些委托,接下来我们来看看.net框架自带的各种委托。
1、不带返回值的委托
Action act1 = () => { }; //泛型委托 Action<string> act2 = name => { Console.WriteLine(); };//一个参数的话,可以去掉小括号 //最多可以有16个参数 Action<string, int, long, DateTime, char, double, decimal> act3 = (par1, par2, par3, par4, par5, par6, par7) => { };
2、带返回值的委托
Func<string> fun1 = () => "fdafds"; Func<DateTime> fun2 = () => DateTime.Now; //最多可以有16个参数,带一个返回值 Func<string, int, long, DateTime, char, double, decimal, DateTime> fun3 = (par1, par2, par3, par4, par5, par6, par7) => DateTime.Now; Func<string, int, long, DateTime, char, double, decimal, Action> fun4 = (par1, par2, par3, par4, par5, par6, par7) => act1;