Lambda学习
public class LambdaTest { public delegate void NoReturnNoPara(); public delegate void NoReturnWithPara(int id, string name); public delegate int WithReturnWithPara(int id, string name); public void Show() { int iNum = 100; { //.NetFramework1.0 1.1 NoReturnWithPara method = new NoReturnWithPara(this.Study); method.Invoke(123, "ByBoy"); this.Study(123, "ByBoy"); } { //.NetFramework2.0 匿名函数,其实就是个方法,不用独立声明;共享变量 NoReturnWithPara method = new NoReturnWithPara(delegate (int id, string name) { Console.WriteLine(iNum); Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发1!"); }); method.Invoke(234, "楠nan"); } { //.NetFramework3.0 lambda表达式:参数列表 goes to 方法体 NoReturnWithPara method = new NoReturnWithPara( (int id, string name) => { Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发2!"); }); method.Invoke(345, "ywa"); } { //省略参数类型,语法糖,编译器自动推算,可以省略掉声明 NoReturnWithPara method = new NoReturnWithPara( (id, name) => { Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发3!"); }); method.Invoke(456, "清池"); } { //如果方法体只有一行 可以省略大括号和分号 NoReturnWithPara method = new NoReturnWithPara( (id, name) => Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发!4")); method.Invoke(456, "永远的油条"); } { //实例化委托时,可以省略掉 new NoReturnWithPara(, //也是编译器提供的便捷功能,是语法糖,编译后其实还是有这段代码的 NoReturnWithPara method = (id, name) => Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发!5"); method.Invoke(567, "风行天下"); } //lambda表达式是什么?! //lambda是代码的简化,其本质是个方法,而不是委托(类),也不是委托的实例,只是实例化委托的时的参数! //反编译查看,会为lambda生成类中类,密封+私有,里面多了几个方法,跟lambda一一对应,lambda也是个语法糖,编译后会起名字 //lambda表达式注册多播委托是无法移除的! //很多复杂的lambda不会写,可以回去写方法! { NoReturnWithPara method = (i, s) => Console.WriteLine($"{i}-{s}跟着Eleven老师学习.Net高级开发!6"); } { //下面我准备去花式使用lambda,有问题直接问 //Action 框架提供 0到16个参数 没有返回值的 泛型委托 Action action = () => { };//参数为空 就小括号 Action<string> action1 = s => Console.WriteLine(s); //只有一个参数 可以去掉小括号 Action<string, int> action2 = (s, i) => Console.WriteLine($"{i}-{s}跟着Eleven老师学习.Net高级开发!6"); Action<string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long> action16 = null; } { //Func 框架提供 0到16个参数 带返回值的 泛型委托 Func<int> func = () => DateTime.Now.Year;//如果方法体只有一行 需要去掉retrun Func<int, string> func1 = i => i.ToString(); Func<int, string, DateTime> func2 = (i, s) => DateTime.Now; Func<string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long, decimal> func16 = null; } { //Action Func 都是.30出来,是为了统一委托的使用,以后只要用的到委托,都可以用。多线程Task.Run Linq... } { //lambda表达式只能用在委托吗 //不是的 c#6 多了很多应用 //表达式目录树,可以用lambda快速声明 new List<int>().AsQueryable().Where(i => i > 3); Expression<Func<int, bool>> expression = i => i < 10; } } private void DoNothing() { } private void Study(int id, string name) { Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发!"); } //起码是vs2015才能用 public void SayHi() => Console.WriteLine(12345); public int Age => 3; }