20250606-C#知识:匿名函数、Lambda表达式与闭包
C#知识:匿名方法、Lambda表达式与闭包
闭包乍一听感觉很复杂,其实一点也不简单
1、匿名方法
- 没有方法名的方法
- 一般用于委托和事件
Func<int, int, int> myAction = delegate(int a, int b) { return a + b; };
Console.WriteLine( myAction(1, 2)); //3
2、Lambda表达式
- 作用类似匿名函数
- 可以省略参数类型,大括号和return关键字
myAction = (a, b) => a * b;
Console.WriteLine(myAction(2,3)); //6
3、闭包
- 是内层函数与引用的外层函数中的外部变量的绑定
- 闭包会延长所引用的外部变量的生命周期
- 从绑定关系角度来看,闭包中的外部变量对于内层函数,类似于静态成员变量对于类变量
static void Test(ref Func<int> myFunc)
{int value = 2;myFunc = () => ++value;
}
Func<int> myFunc = null;
Test(ref myFunc);
Console.WriteLine(myFunc()); //3
Console.WriteLine(myFunc()); //4
- 内层函数会捕获外部变量的引用
这里闭包中捕获的是myCake对象的引用,在外面修改了myCake对象的成员变量的值,修改也会反映到闭包中。
static Cake Test2(ref Func<int> myFunc)
{Cake myCake = new Cake(100);myFunc = () => ++myCake.price;myCake.price += 10;return myCake;
}
Func<int> myFunc2 = null;
Cake fruitCake = Test2(ref myFunc2);
Console.WriteLine(myFunc2()); //111
Console.WriteLine(myFunc2()); //112
fruitCake.price = 10086;
Console.WriteLine(myFunc2()); //10087
Console.WriteLine(myFunc2()); //10088
4、完整代码示例
namespace LearnLambda
{internal class Program{class Cake{public int price;public Cake(int price) => this.price = price;}static void Test(ref Func<int> myFunc){int value = 2;myFunc = () => ++value;}static Cake Test2(ref Func<int> myFunc) {Cake myCake = new Cake(100);myFunc = () => ++myCake.price;myCake.price += 10;return myCake;}static void Main(string[] args){//匿名方法Func<int, int, int> myAction = delegate(int a, int b) { return a + b; };Console.WriteLine( myAction(1, 2)); //3//Lambda表达式myAction = (a, b) => a * b;Console.WriteLine(myAction(2,3)); //6//闭包Func<int> myFunc = null;Test(ref myFunc);Console.WriteLine(myFunc()); //3Console.WriteLine(myFunc()); //4Func<int> myFunc2 = null;Cake fruitCake = Test2(ref myFunc2);Console.WriteLine(myFunc2()); //111Console.WriteLine(myFunc2()); //112fruitCake.price = 10086;Console.WriteLine(myFunc2()); //10087Console.WriteLine(myFunc2()); //10088}}
}
5、参考资料
- 《唐老狮C#》
- C#—闭包详解
本篇结束,感谢您的阅读~