简单了解委托、泛型委托、表达式树、Lambda等
委托
有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。先上一段代码:
下边的代码,完成了一个委托应用的演示。一个委托分三个步骤:
1 public partial class WebForm3 : System.Web.UI.Page 2 { 3 //step01:首先用delegate定义一个委托 。 4 public delegate int CalculatorAdd(int x, int y); 5 6 protected void Page_Load(object sender, EventArgs e) 7 { 8 //step03:用这个方法来实例化这个委托。 9 CalculatorAdd cAdd = new CalculatorAdd(Add); 10 //int result = cAdd(5, 6); 11 int result = cAdd.Invoke(5,6); 12 } 13 // step02:声明一个方法来对应委托。 14 public int Add(int x, int y) 15 { 16 return x + y; 17 } 18 }
step01:首先用delegate定义一个委托 。
step02:声明一个方法来对应委托。
step03:用这个方法来实例化这个委托。
至此,一个委托的应该就完成了,就可以调用委托了。
匿名方法
在上一分钟已经知道了,完成一个委托应用分三步走,缺一步都不行,如果要跨大步,当心步子大了扯着蛋。但是微软不怕扯着蛋,非要把三步做成两步来走啊!所以微软就用匿名方法来简化上边的三个步骤。匿名方法这个玩意儿怎么说呢,在C#中完全是可有可无的东西,只是为C#锦上添花,有人别出心裁给它取个名字叫语法糖。
1 public partial class WebForm3 : System.Web.UI.Page 2 { 3 //step01:首先用delegate定义一个委托 4 public delegate int CalculatorAdd(int x, int y); 5 6 protected void Page_Load(object sender, EventArgs e) 7 { 8 //step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托 9 CalculatorAdd cAdd = delegate(int x, int y) { return x + y; }; 10 int result = cAdd.Invoke(5, 6); 11 } 12 }
step01:首先用delegate定义一个委托 。
step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托,其实这种写法就是匿名方法。
这时会惊奇的发现,这不是三步当着两步走了哇?
Lambda表达式
原本很简单的程序,加上几个delegate关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。但是微软对C#的设计理念是简单易用。微软就想方设法的来简化delegate(int x, int y) { return x + y; }这个匿名方法,Lambda就出现了。下边我来看几种lambda表达式的写法:
1 public partial class WebForm3 : System.Web.UI.Page 2 { 3 public delegate int CalculatorAdd(int x, int y); 4 5 protected void Page_Load(object sender, EventArgs e) 6 { 7 //方法一: 8 CalculatorAdd cAdd1 = (int x, int y) => { return x + y; }; 9 int result1 = cAdd1(5, 6); 10 11 //方法二: 12 CalculatorAdd cAdd2 = (x, y) => { return x + y; }; 13 int result2 = cAdd2(5, 6); 14 15 //方法三: 16 CalculatorAdd cAdd3 = (x, y) => x + y; 17 int result3 = cAdd2(5, 6); 18 } 19 }
方法一:简单的把delegate去掉,在()与{}之间加上 "=>"。
方法二:在方法一的基础上把参数类型都干掉了。
方法三:要干就干彻底些,把{},以及return关键字都去掉了。
这几种方法随便怎么写都行,不过就是害苦了初学者,一会儿看到这种写法,一会儿看到那种写法,把人搞的神魂颠倒人,如果没人指点,确实会迷糊,难就难在这儿。
泛型委托
随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了。
1 public partial class WebForm3 : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 //方法一: 6 Func<int,int,int> cAdd1 = (int x, int y) => { return x + y; }; 7 int result1 = cAdd1(5, 6); 8 9 //方法二: 10 Func<int, int, int> cAdd2 = (x, y) => { return x + y; }; 11 int result2 = cAdd2(5, 6); 12 13 //方法三: 14 Func<int, int, int> cAdd3 = (x, y) => x + y; 15 int result3 = cAdd2(5, 6); 16 } 17 }
不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步是定义一个委托,另一步是用一个方法来实例化一个委托。 微软干脆把这两步都合成一步来走了。用Func来简化一个委托的定义。
至此一个委托的应用就可用 Func<int, int, int> cAdd3 = (x, y) => x + y; 这样一句话来完成了,其中的Func就是所谓的泛型委托。
表达式树
表达式树其实与委托已经没什么关系了,非要扯上关系,那就这么说吧,表达式树是存放委托的容器。如果非要说的更专业一些,表达式树是存取Lambda表达式的一种数据结构。要用Lambda表达式的时候,直接从表达式中获取出来,Compile()就可以直接用了。如下代码:
1 public partial class WebForm3 : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 Expression<Func<int, int, int>> exp = (x, y) => x + y; 6 Func<int, int, int> fun = exp.Compile(); 7 int result = fun(2, 3); 8 } 9 }
精品文章,简单易懂。
作者:Li keli
出处:https://www.cnblogs.com/likeli/p/4433733.html
本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个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——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?