namespace Lesson15_lambda表达式 { class Program { static void Main(string[] args) { #region 知识点一 什么时lambda表达式 //可以将lambda表达式理解为 匿名函数的简写 //它除了写法不同外 //使用上和匿名函数是一样的 //都是配合委托类型使用的 #endregion #region 知识点二 lambda表达式的语法 //匿名函数 //delegate(参数列表){函数体}; //lambda表达式 //(参数列表)=>{函数体}; #endregion #region 知识点三 使用 //1.无参无返回值的lambda表达式 Action a = () => { Console.WriteLine("无参无返回的lambda表达式函数"); }; a(); //2.有参无返回值的lambda表达式 Action a2 = (int i1) => { Console.WriteLine($"有参无返回的lambda表达式 参数i1:{i1}"); }; a2(100); //3.有参的lambda表达式,甚至参数类型都可以省略 参数类型和委托或事件容器一致 Action a3 = (i1) => { Console.WriteLine($"有参无返回的lambda表达式 参数i1:{i1}"); }; a3(200); //4.有返回值的lambda表达式 Func f = (i1, i2) => { Console.WriteLine($"有返回的lambda,将返回{i1}与{i2}相加"); return i1 + i2; }; Console.WriteLine(f(10, 20)); #endregion Test t = new Test(); t.Dosomething(); } } #region 知识点四 闭包 //内层的函数可以引用包含在它外层的变量 //即使外层函数已经执行完毕 //注意: //该变量提供的值并不是变量创建时的值,而是在父函数范围内最后一次被修改的值 #endregion class Test { public event Action action; public Test() { int value = 10; //这里就是一个闭包的例子 //因为 当构造函数执行完毕后 value变量的生命周期应该结束了 //但是由于action引用了value变量 //所以value变量的生命周期被延长了 action = () => { Console.WriteLine($"闭包value的值为:{value}"); }; for (int i = 0; i < 10; i++) { int index = i;//解决闭包问题的常用方法 //每次都是新创建的index变量,所以可以保存当时的值 //但是i是在循环里的,所以每次循环都是同一个i变量,所以最终闭包引用的i变量的值就是循环结束时的值10 action += () => { Console.WriteLine($"闭包循环i的值为:{i}"); Console.WriteLine($"闭包循环index的值为:{index}"); }; } } public void Dosomething() { action(); } } }