Lambda表达式
在之前 委托的简单使用 一文中有个令大家很难受的写法,仅仅只有一行代码却单独需要声明一个方法,然后将这方法传递给委托。
//3.委托初级版 需要声明多个方法 { Console.WriteLine("***************委托初级版 需要声明多个方法******************"); Func<Double, Double, Double> delplus = new Func<double, double, double>(delPlus);// 3. 实例化委托 //Func<Double, Double, Double> delplus = delPlus; Console.WriteLine(delCalculate(10, 5, delplus)); Func<Double, Double, Double> delminus = new Func<double, double, double>(delMinus); Console.WriteLine(delCalculate(10, 5, delminus)); Func<Double, Double, Double> delmultiply = new Func<double, double, double>(delMultiply); Console.WriteLine(delCalculate(10, 5, delmultiply)); Func<Double, Double, Double> deldivide = new Func<double, double, double>(delDivide); Console.WriteLine(delCalculate(10, 5, deldivide)); Console.WriteLine("***************结束******************"); } #region 委托 #region 自己声明委托 //delegate Double del(Double x, Double y); // 1. 声明委托 方法签名需要一致 //private Double delCalculate(Double x, Double y, del del) //{ // Double results = del.Invoke(x, y); //4. 使用委托 // //把x y写入数据库 写入日志等等操作 // return results * 1000; //} #endregion #region 使用func委托 private Double delCalculate(Double x, Double y, Func<Double, Double, Double> del) { Double results = del.Invoke(x, y); //4. 使用委托 //把x y写入数据库 写入日志等等操作 return results * 1000; } #endregion #region 委托需要的方法 private Double delPlus(Double x, Double y) //2. 写委托用的方法 { return x + y; } private Double delMinus(Double x, Double y) { return x - y; } private Double delMultiply(Double x, Double y) { return x * y; } private Double delDivide(Double x, Double y) { return x / y; } #endregion #endregion
先来看一段代码,看完之后相信各位都能明白Lambda的写法。
{ //需要声明一个方法 然后声明委托时调用 Func<Double, Double, Double> func = new Func<Double, Double, Double>(Plus); Console.WriteLine(func.Invoke(10, 5)); } { //不需要额外声明一个方法 在声明委托时直接写方法(用delegate替代方法名与修饰符) Func<Double, Double, Double> func = new Func<Double, Double, Double>(delegate (Double x, Double y) { return x + y; }); Console.WriteLine(func.Invoke(10, 5)); } { //lambda表达式成型 语法糖 匿名方法 Func<Double, Double, Double> func = new Func<Double, Double, Double>( (Double x, Double y) => { return x + y; }); Console.WriteLine(func.Invoke(10, 5)); } { //可以去掉参数中的类型签名 //因为写在委托内的方法(正确写法)说明了这个方法是符合签名委托声明的约束的 //所以方法中的参数类型与委托中的参数类型相对应 Func<Double, Double, Double> func = new Func<Double, Double, Double>((x,y) => { return x + y; }); Console.WriteLine(func.Invoke(10, 5)); } { //如果方法体只有一行 可以去掉大括号 分号 return Func<Double, Double, Double> func = new Func<Double, Double, Double>((x, y) => x + y); Console.WriteLine(func.Invoke(10, 5)); } { //委托的声明 是可以去掉new 直接写等于方法的 所以最终使用了lambda表达式的委托如下 //Func<Double, Double, Double> func = Plus; Func<Double, Double, Double> func = (x, y) => x + y; Console.WriteLine(func.Invoke(10, 5)); //Func<Double, Double> func2 = x => x + 5; //Func<Double> func3 = () => 10 + 5; }
经过层层改良,最终有了Lambda。Lambda表达式是由左边参数、中间=>(英文读作"goes to",中文可以读作"转到”)符号、右边为方法体。
回到上篇文章因为x与y的加减乘除需要写四个方法,使用了Lambda之后:
//4.委托进阶版 委托加lambda表达式 { Console.WriteLine("***************委托进阶版 委托加lambda表达式******************"); Console.WriteLine(delCalculate(10, 5, (x, y) => x + y)); Console.WriteLine(delCalculate(10, 5, (x, y) => x - y)); Console.WriteLine(delCalculate(10, 5, (x, y) => x * y)); Console.WriteLine(delCalculate(10, 5, (x, y) => x / y)); Console.WriteLine("***************结束******************"); }