理解Lambda表达式












这两种写法都是可以的,出来的IL也一样,但是意义是不同的,后者相当于匿名方法,前者
更像是"匿名"的委托,其实这样写:





首先还是要弄清Lamdba表达式的几个特性:
1. Lamdba 表达式是一个委托类型:
MethodInvoker invoker = () => { Console.WriteLine(); };
//is actually equal to the following form.
MethodInvoker invoker = delegate() { Console.WriteLine(); };
//这里是Lamdba 表达式的匿名委托的用法
2. Lamdba 表达式可以用作匿名方法
MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//相当于:
MethodInvoker invoker = new MethodInvoker(MyFunc);
partial void MyFunc()
{
Console.WriteLine();
}
我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的
实际上,当我们这样去new 一个委托的时候:
MethodInvoker invoker = new MethodInvoker(MyFunc);
"MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
可以这样理解编译器的行为: 匿名方法其实也就是委托。
那么为什么我们可以这么写呢:
MethodInvoker invoker = () => { Console.WriteLine(); };
我们来看一看:
首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
但是匿名的delegate 可以转化成函数指针 (void() target):
所以这样写是可以的:
MethodInvoker invoker = new MethodInvoker(MyFunc);
//而匿名的委托又可以描述为Lambda表达式
MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:
MethodInvoker invoker = delegate() { Console.WriteLine(); };
//而匿名的委托又可以用Lambda表达式来描述
MethodInvoker invoker = () => { Console.WriteLine(); };
从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!





2. Lamdba 表达式可以用作匿名方法








实际上,当我们这样去new 一个委托的时候:
MethodInvoker invoker = new MethodInvoker(MyFunc);
"MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
可以这样理解编译器的行为: 匿名方法其实也就是委托。
那么为什么我们可以这么写呢:
MethodInvoker invoker = () => { Console.WriteLine(); };
我们来看一看:
首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
但是匿名的delegate 可以转化成函数指针 (void() target):
所以这样写是可以的:








从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!
posted on 2007-09-26 13:42 J.D Huang 阅读(2054) 评论(2) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述