1 什么是委托

委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。调用委托变量时,就是执行该变量指向的方法。

委托与c#中的普通变量【如int i=5】类似,唯一区别在于委托指向方法,普通变量执向整数为5的空间

委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
声明委托的语法如下:

delegate <return type> <delegate-name> <parameter list>
关键字     返回类型        委托的名称       参数列表

根据上述语法,可自定定义自己的委托类型【返回类型与参数列表与被执向的方法类型一致】委托一旦声明,允许执向的方法就确定了
delegate string my_delegate_1(int i,int j) ; //允许执向参数为int,返回为string类型的方法
delegate void my_delegate_2; //允许执向无参数,无返回值的方法

2 委托的使用

 public class DelegateStudy{/// <summary>/// 扩展方法/// </summary>public DelegateStudy() {}public void F1() {Console.WriteLine("我是方法F1");}public int F2(int i) {Console.WriteLine("我是方法F2");return i + 1;}public int F3() {Console.WriteLine("我是方法F3");return 10;}public int F4(string s){Console.WriteLine("我是方法F4"+s);return 10;}}
   class Program{//委托的声明//无返回的委托delegate void f1();//有返回的委托delegate int f2(int i);//无参数无返回值static Action action;//无参数有返回值【int】static Func<int> func;//有参数有返回值 输入参数类型为string,返回类型为intstatic Func<string, int> func1;static void Main(string[] args){//避免控制台输出乱码Console.OutputEncoding = Encoding.Unicode;DelegateStudy delegateStudy = new DelegateStudy();//委托的使用 //d1变量指向DelegateStudy中的F1()方法f1 d1 = delegateStudy.F1;//委托使用d1();//d2变量指向DelegateStudy中的F2()方法f2 d2 = delegateStudy.F2;//委托使用int l= d2(5);Console.WriteLine("委托2的返回值为:"+l);//使用new关键字实例化委托f2 d22 = new f2(delegateStudy.F2);int ll= d22(10);Console.WriteLine("委托2-的返回值为:" + ll);Console.WriteLine("Hello World!");//系统自定义的委托action= delegateStudy.F1;//委托使用action();func = delegateStudy.F3;//委托使用int lll=func();Console.WriteLine("func变量执行的方法返回值为:" + lll);func1 = delegateStudy.F4;//委托使用int llll= func1("ssssss");Console.WriteLine("func1变量执行的方法返回值为:" + llll);}}

控制台输出如下:

c#定义了无返回的委托Action以及有返回的泛型委托Func,所以一般不需要自行定义委托
Action具有以下多种重载,可根据实际自行选择无返回的委托(带参数或不带参数)

Func具有以下多种重载,可根据实际自行选择有返回的委托(带参数或不带参数)

3 委托与Lamda表达式的关系

委托除了可以指向一个明确的方法时,通常也可以执行一个匿名方法。而匿名方法通常可以用Lamda表达式来定义。

        /// <summary>/// 委托同样可以指向匿名方法/// </summary>Func<int, int, int> fun1 = delegate (int i, int j){Console.WriteLine("fun1指向匿名方法");return i + j;};/// <summary>/// 匿名方法采用lamda表达式/// 因为已确定fun2委托变量的参数类型为int,意味着该委托只能指向形如 int functionName(int a,int b)的方法。在匿名表达式的参数类型确定后,可以忽略参数类型/// </summary>Func<int, int, int> fun2 = (i, j) => {Console.WriteLine("fun2指向匿名方法【采用lamda表达式】");return i + j;};/// <summary>/// 1委托可以指向匿名方法/// 2匿名方法可以采用lamda表达式/// 3当匿名表达式有返回值,且只有一行逻辑时,可以省略{}及return/// </summary>Func<int, int, int> fun3 = (i, j) => i+j;/// <summary>/// 1委托可以指向匿名方法/// 2匿名方法可以采用lamda表达式/// 3当匿名表达式无返回值,且只有一行逻辑时,可以省略{}/// </summary>Action<int, string> action1 = (age, name) => Console.WriteLine($"年龄:{age},名字:{name}");/// <summary>/// 1委托可以指向匿名方法/// 2匿名方法可以采用lamda表达式/// 3action2的委托只能指向 void functionName(int i)的方法/// 3当匿名方法只有一个参数时,可以省略掉参数()/// </summary>Action<int> action2 = i=> Console.WriteLine(i*i);

.Net学习——委托相关推荐

  1. unity学习-委托(delegate),事件(event),Action,Func

    unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中,一直存在着对代码管理不当的问题,所以需要学习一些科学的代码思维,减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b ...

  2. (周星驰版)学习委托的最好实例 (转载+自己补充了注释)

    ".net百题问答的活动"--许多人问过的--< C#委托及事件 > 有许多人问的,.Net中的委托以及事件处理.我拿简单的例子说明一下,是现实中的例子: 比如说一个公 ...

  3. C#深入学习--委托

    一.基本概念 有过买二手房交易的朋友都有感触,办理过户等等一系列手续都是相当麻烦的,这个时候,房产中介出现了,我们只需要将必备资料交个中介,他们就会帮忙办理的妥妥的,我们并不需要关系整个办理过程,这个 ...

  4. C#学习(一):委托和事件

    预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...

  5. C#编程利器之四:委托与事件(Delegate and event) (上)

    本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处. ...

  6. C#:委托基础与事件

    通过以下思维导图,学习委托的基本概念,后面着重讲解委托的运用,希望通过最简单的方式收获更多的知识. 1.委托的各种写法 1.委托 委托名=new 委托(会调用的方法名); 委托名(参数); 2.委托 ...

  7. C#编程之委托与事件(一)

    多线程程序设计是一个庞大的主题,而本文试图在.net Framework环境下,使用C#语言来描述委托.事件.多线程程序及反射的概貌.希望本文能有助于大家理解委托.事件.多线程及反射的概念,理解委托. ...

  8. 笑谈“委托”与“事件”

    这几天学习委托的时候,突然冒出了一个很有趣的想法,写出来与大家分享: 有一天,我饿了,虽然我拥有白菜和猪肉,本来能够做一道美味的白菜炖猪肉,但我却没有把白菜和猪肉做成白菜炖猪肉的方法.这时,我想到了& ...

  9. 测试Unity中常用代码的运行所需时间:循环和函数篇 #性能测试 # for,foreach,while循环 #委托事件

    C# 循环和函数篇 〇.前言 系统自带计时器 -System.Diagnostics.StopWatch- 的使用 一.循环类型测试 1. for 循环测试 (1). 前后置自增自减测试 (2). 与 ...

最新文章

  1. C语言中static全局变量与普通的全局变量区别
  2. js实现反恐精英+曲线图+饼状图
  3. 开发用户导航栏和权限信息接口
  4. 汇编浮点指令fld、fstp
  5. C/C++宏的使用总结
  6. c++二维数组指针详解
  7. 2014 网选 5012 Dice(bfs模板)
  8. dd实现Linux转移,linux命令-dd {拷贝并替换}
  9. iic总线从机仲裁_IIC协议底层原理超详细解析!示波器,逻辑分析仪多图预警
  10. Ubuntu服务器修复,ubuntu – 服务器攻击,如何修复它
  11. linux 基础学习之常用命令
  12. shiro filter
  13. Choerodon 的微服务之路(二):Choerodon 的微服务网关
  14. python tkinter frame滚动条_如何在Tkinter中创建带有滚动条的LabelFrame?
  15. Java层Binder使用(ServiceManager)
  16. 使用Visual Studio来创建动态库/静态库,并加载
  17. 【OpenCV】绘图与注释——绘制色差图
  18. Centos7升级OpenSSL 1.0.2k-fips
  19. 机房温度远程监控方案
  20. linux查询进程号是否存在启动脚本,Shell实现判断进程是否存在并重新启动脚本分享...

热门文章

  1. 【python @ 小甲鱼网课】 P6列表(1)
  2. 计算机实验word42,Word2010计算机实验报告--.docx
  3. ABB机器人拆装说明书_ABB 机器人拆装维护案例.pptx
  4. 微信JS-SDK坐标位置转换为百度地图坐标
  5. android 获得顶层窗口_Android 实现顶层窗口、浮动窗口(附Demo)
  6. Aionもし初めならば:すべてすべてまったくありもしない話なので
  7. 电脑加内存遇到的不开机问题解决
  8. JMeter学习-006-JMeter 断言
  9. 分类变量回归——Probit和Logit(附代码)
  10. Pinyin4jUtil 验证姓名与拼音是否一致,自持多音字。