什么是委托
委托跟类一样,是用户自定义的类型。但类是表示数据的集合,委托是具有兼容返回类型和输入参数的方法或lambda表达式的集合。 
如果你学过C++,那么可以把委托理解为指向函数的指针。但是,委托是类型安全和可靠的。 
你可以把委托看做一个包含有【有序方法列表】的对象。这些方法具有相同的返回类型和签名(参数列表,包括ref和out修饰符)。 
在调用委托时,会执行【有序方法列表】的所有方法。

委托的使用
声明委托类型
delegate <return type> <delegate-name> <parameter list>
e.g.
delegate void Mydel(int x);
1
2
3
创建委托对象
//变量声明
Mydel delVaer;

//使用带new运算符的对象创建表达式
delVar = new MyDel(Method1);
//快捷语法
delVar = Method1;

//当然也可以把创建变量初始化放在一起
Mydel delVar = new MyDel(Method1);
Mydel delVar = Method1;
**委托是引用类型**
1
2
3
4
5
6
7
8
9
10
11
12
组合委托
MyDel delA = Method1;
MyDel delB = Mythod2;
MyDel delC = delA + delB;
//delC的方法列表是delA和delB的方法列表的组合
1
2
3
4
为委托增加方法
Mydel del = Method1;
del += Method2;
del += Method3;
//委托是不可变的,所以实际发生的是创建了一个新委托,其调用列表是旧委托列表和方法的组合,然后这个新的委托赋值给del
1
2
3
4
从委托移除方法
del  -=  Method1;
//和增加方法一样,这里实际发生的是创建了一个新的委托
1
2
需要注意的是: 
1. 删除的过程是从列表的最后开始搜索,并且移除第一个匹配的放法。 
2. 试图删除委托中不存在的放法没有效果 
3. 试图调用空委托会发生异常 
4. 如果委托的调用列表为空,则委托是null

调用委托 
可以像调用方法一样调用委托,委托的参数会用于方法列表的所有方法(除非有一个参数是输出参数)。
Mydel del = Method1;
del += Method2;
del += Method3;
del();//调用委托
1
2
3
4
调用带返回参数的委托 
如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况:

调用列表最后一个方法的返回值就是委托的返回值
调用列表中其他方法的返回值都会被忽略
调用带引用参数的委托

匿名方法

delegate int Mydel(int x);
Mydel del = delegate (int x){return x+1;}
1
2
emmm,就是没有名字的方法。 
语法:

delegate (Parameters){ ImplementationCode }
1
返回类型:匿名方法不会显式的声明返回类型,但其返回类型必须与对应的委托相一致
参数:必须与委托一致。需要注意的是,委托中的params关键字会被匿名方法忽略。
被捕获变量的生命周期会拓展。
delegate void Mydel();
static void Main(){
  Mydel del;
  {
    int x = 5;//对匿名函数而言是外部变量
    del = delegate(){
      Console.WriteLine(x);//x被捕获
    }
  }
  Console.WriteLine(x);//报错,未定义x
  if (del != null){
    del();//输出x的值
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Lamabda表达式 
emmm,跟匿名函数一样是为了方便。其实,如果lambda表达式如果被先引进,就不会有匿名函数了。
Mydel del = delegate(int x)  {return x+1;}
Mydel del =         (int x)=>{return x+1;}
Mydel del =         (x)=>{return x+1}//可以省略类型
Mydel del =         x =>{return x+1}//如果只有一个参数可以省略()
Mydel del = x => x+1//若果语句块只包含一个返回语句,则可以把语句块替换为return后的表达式
1
2
3
4
5
lambda表达式要点: 
1. lambda表达式参数列表中的参数必须在类型、数量和位置上与委托相匹配 
2. 参数类型可以省略(隐式类型)。除非委托中有ref或者out参数—此时类型是必须的。 
3. 如果只有一个参数并且是隐式的,则可以省略(),否则()是必须的 
4. 如果没有参数,必须使用()
--------------------- 
作者:guojunxiu 
来源:CSDN 
原文:https://blog.csdn.net/guojunxiu/article/details/81010849 
版权声明:本文为博主原创文章,转载请附上博文链接!

C# 委托(Delegate)相关推荐

  1. C# 委托(Delegate) 事件(Event)应用详解

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  2. C#委托(delegate、Action、Func、predicate)和事件

    C#委托(delegate.Action.Func.predicate)和事件 - 园子的蜗牛 - 博客园 C#之委托 - 摸鱼王 - 博客园 C++函数指针与C#委托之间有何联系 - 51CTO.C ...

  3. C#-----委托delegate的定义与使用

    委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法 委托的声明: delegate <函数返回类型> <委托名> (<函数参数>) //声明委托 del ...

  4. C#基础知识学习之 ✨ “精神小伙“——委托(delegate) 的含义和用法

    C#委托(Delegate) 在C#的学习过程中,自然有我们的精神小伙--委托 的一席之地 本文就介绍一下C#中的委托,这位可以包含同类方法函数的小伙子 C# 中的委托(Delegate)类似于 C ...

  5. 理解委托(delegate)及为什么要使用委托

    委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各 ...

  6. 异步使用委托delegate --- BeginInvoke和EndInvoke方法

    当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托. 方法BeginInvoke有两个参数: Async ...

  7. 跟小静学CLR via C#(12)-委托Delegate

    本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...

  8. jquery-事件委托-delegate

    代理的使用 如果希望某个成员绑定某个事件,例如li标签编定click事件 期望新进来的li也能得到这个事件 可以通过事件委托来实现 事件委托的格式 父级标签对象.delegate(str子级标签选择器 ...

  9. lambda表达式不使用委托(delegate) 用FUNC

    lLambda不使用delegate关键字,而使用  Lambda运算符 => goes to l    1.Func<int,string> getInput = (int age ...

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

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

最新文章

  1. 关于STL 容器的嵌套使用, 小试牛刀
  2. c语言24点程序,C语言24点问题
  3. 如何在Windows上使用64位Web浏览器
  4. 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)
  5. uva 10883——Supermean
  6. JavaScript面向对象--继承 (超简单易懂,小白专属)...
  7. 表空间(tableSpace) 段(segment) 盘区(extent) 块(block) 关系
  8. linux复制内容的快捷键,Linux复制粘贴快捷键
  9. C#6.0 十大常用特性
  10. 大数据架构师工作内容有哪些?
  11. PB级(大数据)的来源
  12. mysql inner 连接多表_MySQL数据库之多表查询inner join内连接
  13. 阿里巴巴代码规范插件
  14. wifi mesh测试软件,「可能是」最适合我的Mesh+WiFi6方案:Linksys Velop MX10600体验分享...
  15. java正则表达式yyyymmdd_日期正则表达式yyyyMMdd
  16. 线性代数之——复数矩阵
  17. python123第三次作业的解答
  18. 腾讯java校招,09.26 腾讯校招前端一面经历
  19. 怎样从电脑传入视频到ipad 播放
  20. 零基础如何学习JAVA编程开发

热门文章

  1. 在创业公司做架构师,你需要解决哪些问题?
  2. 分布式计算的模式语言读后感
  3. 【采用】风控模型评估方法以及大数据风控模型概念
  4. 元宇宙和游戏赚钱的兴趣正与日俱增
  5. R统计笔记(四):中括号与双中括号的差异
  6. 支付接入开发的陷阱有多深?
  7. 可视化自编码器训练结果
  8. 白话Elasticsearch34-深入聚合数据分析之案例实战bucket嵌套实现颜色+品牌的多层下钻分析
  9. 白话Elasticsearch16-深度探秘搜索技术之使用原生cross-fiedls技术解决搜索弊端
  10. Spring-Spring配置概述