摘要

委托是C#编程一个非常重要的概念,也是一个难点。本文将系统详细讲解委托。

1. 委托是什么?

其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的角度不同。个人认为,可以从以下2点来理解:

 (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型

(2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象。

既然委托是一种类型,那么它存储的是什么数据?

我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

2. 委托类型的定义

委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

delegate void MyDel(int x);

委托类型声明:

(1) 以deleagate关键字开头。

(2)返回类型+委托类型名+参数列表。

3. 声明委托变量

MyDel del1,del2;

4. 初始化委托变量

(1) 使用new运算符

new运算符的操作数的组成如下:

  • 委托类型名
  • 一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以是实例方法或静态方法。
del1 = new MyDel( myInstObj.MyM1 );
del2 = new MyDel( SClass.OtherM2 );

(2)使用快捷语法

快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称和其相应的委托类型之间有隐式转换。

del1 = myInstObj.MyM1;
del2 = SClass.OtherM2;

5. 赋值委托

由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

MyDel del;
del = myInstaObj.MyM1; //委托初始化
del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收

6. 组合委托

委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

委托是恒定的,操作数委托创建后不会被改变。委托组合拷贝的是操作数的副本

MyDel del1 = myObj.MyMethod;
MyDel del2 = SClass.OtherM2;
MyDel del3 = del1 + del2;   //组合调用列表

7. 委托加减运算

可以使用+=运算符,为委托新增方法。

同样可以使用-=运算符,为委托移除方法。

MyDel del = myObj.MyMethod;
del += SClass.OtherM2; // 增加方法
del -= myObj.MyMethod; // 移除方法

8. 委托调用

委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

if(null != del)
{del();//委托调用
}

9. 匿名方法

匿名方法是在初始化委托时内联声明的方法。

基本结构:

deleage( 参数 ) { 语句块 }

例如:

 
delegate int MyDel (int x); //定义一个委托 MyDel del = delegate( int x){ return x; };

从上面我们可以看到,匿名方法是不会显示声明返回值的

10. Lambda表达式

Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

  • 删除delegate关键字
  • 在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。
MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式

from: http://www.cnblogs.com/liuhaorain/p/3911845.html

C#委托使用详解(Delegates)相关推荐

  1. C#事件与委托(详解)

    C#事件与委托详解[精华 多看看] Delegate delegate是C#中的一种类型,它 实际上是一个能够持有对某个方法的引用的类. 与其它的类不同,delegate类能够拥有一个签名(signa ...

  2. Kotlin | 委托(Delegation )详解

    本文要点概述 辨析委托模式与代理模式 接口委托(Delegated interface) 属性委托(Delegated properties) 映射委托(Map delegation) 延迟属性(la ...

  3. JS中的事件委托 / 代理详解

    [前言] 事件委托/代理是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的 [主体] 概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用 ...

  4. 类加载器双亲委托机制详解

    理论了解: 关于类加载器的双亲委托机制基本上都听说过,面试时可能偶尔也会被问到,但是可能都是网上去找了一个理论性的答案临时了解了一下,并未对它到底是个什么样的机制有深入的了解,所以接下来准备深入了解它 ...

  5. 同花顺核下单python_同花顺核新委托下单详解

    核新委托下单介绍 下单界面有完整模式和精简模式两种,适合用户的不同操作习惯. 完整模式: 完整模式是传统的模式,下单界面作为一个独立的窗口浮动在行情界面上.该模式下单界面所占的空间比较大, 打开下单时 ...

  6. Kotlin——中级篇(二): 属性与字段详解

    在前面的章节中,详细的为大家讲解到了Kotlin中对类的类的定义.使用.初始化.初始化.类继承等内容,但是在一个类中,几乎上是不可能不出现属性与字段(field)的,这一篇文章就为大家奉上Kotlin ...

  7. 委托与事件代码详解与(Object sender,EventArgs e)详解

    委托与事件代码详解 using System; using System.Collections.Generic; using System.Text; namespace @Delegate //自 ...

  8. 基础拾遗------委托详解

    基础拾遗: 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗---- ...

  9. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

最新文章

  1. AWS S3云存储服务
  2. 连麦互动直播方案全实践3:网易云信连麦互动的实现方案
  3. 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法
  4. 《Internet 路由结构(第2版•修订版)》一7.5 常见问题
  5. 手把手教你训练一个神经网络,打爆21点!
  6. 多线程lambda数据捕获
  7. python应用系列教程——python使用socket创建udp服务器端和客户端
  8. 另类的JS常见函数应用
  9. Web站点风格切换的实现
  10. R 语言的安装(详细教程)
  11. 小程序 跳转到腾讯文档小程序
  12. duliu题之狼抓兔子题解
  13. Qt qml listview刷新
  14. 全手动封装教程+SRS9.80102 文本教程(适合初学)
  15. 手机屏幕分辨率真的是越高越清晰吗?
  16. 编写站点robots文件
  17. 用户相关的常用搜索转化率指标
  18. 通俗的解释docker
  19. 用hc05蓝牙模块,开发了几个安卓app了,越来越熟悉蓝牙app了。
  20. 华为防火墙用户与认证

热门文章

  1. reactor官方文档译文(1)Reactor简介
  2. SonarQube代码质量管理平台安装与使用--转载
  3. 使用 JSSE 定制 SSL 连接的属性--转载
  4. Philip S. Yu 讲的广度学习到底是什么?
  5. Visual Studio 2013开发 mini-filter driver step by step (5) - 读写文件
  6. Spring Boot - 构建数据访问层
  7. 软件体系结构测试定义,软件体系结构复习题.doc
  8. SpringBoot微信公众号授权访问认证文件部署
  9. 原生js实现轮播图实例教程
  10. 基于MATLAB的小波收缩法信号去噪