使用icode9重学c#系列——委托和匿名函数
互联网 2022/11/27 1:38:18
前言
简单介绍一下什么是委托。
正文
以前也写过委托,这次算是重新归档,和新的补充吧。
有些人说委托是函数指针的包装,也有些人说委托是一个方法或多个方法的引用。
这都是没有问题,委托是一个概念,微软官方文档说委托是一种引用类型,表示对具有特定参数列表和返回类型的方法引用。
我觉得太啰嗦了,实际上就是方法的引用。
上面都是委托的概念,但是实现方式每种语言可能都不一样。
比如c++ 和 c 用的是函数指针,而c# 用的是生成包装类(等下IL),当然本质还是函数指针。
那么来看下委托。
internal class Program { delegate int TestDelegate(int a); static void Main(string[] args) { TestDelegate a = test; a(0); } public static int test(int a) { return 0; } }
将test 给了委托a,然后调用的时候直接a()就可以了。
用起来十分简单。
实际上对IL来说其实是没有委托这个概念的,通过反编译来看下原理。
private static void Main(string[] args) { TestDelegate a = new TestDelegate(test); a(0); }
实际上会生成TestDelegate这样一个类,然后将test 引用添加进去。
再看下TestDelegate是一个什么样的类。
就是把调用的object 和 法的引用放入包装类中了,然后invoke 可以进行调用。
如果是多个方法的引用呢?
internal class Program { delegate int TestDelegate(int a); static void Main(string[] args) { TestDelegate a = test; a += test; a(0); } public static int test(int a) { return 0; } }
原理就是又new了一个TestDelegate,然后用Delegate 将两个相连。
Combine 是一个静态方法哈
本质是调用a的combineImp这个方法。之所以有这个一个静态方法是为了避免出现a为空的情况,如果a为空,直接把b给a啊。
这个是我们写链式结构可以学习的,这样就不用判断声明的时候是否为空。
然后c# 帮我们提取定义了很多委托,以至于我们几乎不用去声明委托。
比如Func 和 Action,Func 有返回值,Action没有。
标签:c++,对象模型,函数,static,编辑,参数,编写,系统,数据,管理系统 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

关于找一找教程网
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[使用icode9重学c#系列——委托和匿名函数]http://www.zyiz.net/tech/detail-379195.html
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2023-03-22C# 中的 Null 处理技术-icode9专业技术文章分享
- 2023-03-11使用代码片段探索 C# 中的最新功能-icode9专业技术文章分享
- 2023-01-04.net core-利用PdfSharpCore 操作icode9实例
- 2023-01-03重学c#系列——linq(3) [二十九]
- 2023-01-03DevToDo 列表 — 我如何使用 .Net Core 创建和发布 API
- 2022-12-05c#和java的区别_C#和java的语法区别
- 2022-12-05.NET Core Web APi类库如何内嵌运行?
- 2022-12-04.NET 6 实现滑动验证码(二)、基本数据
- 2022-12-04C# Math 中的常用的数学运算