总结

委托的本质:

委托是一种特殊的数据类型,它表示某种特定类型的函数,并且可以表示多个函数,将这些函数串联起来。使用委托就好像函数调用一样。

委托实质上是一个类,编译器会根据关键字delegate自动生成一个从System.Delegate类派生的类。所以,它具有可访问性,public, private等,也包含几个默认的成员函数和属性。(这些可通过IL代码看出编译器为委托生成的具体的类名称和代码)

委托的作用:

委托时一种在C#中实现函数动态调用的方式,通过委托可以将一些相同类型的函数串联起来依次执行。委托同时还是函数回调事件机制的基础。

在函数调用时,委托链上可以具有相同的函数,只要通过“+=”操作添加到委托链上即可。

委托的定义:

delegate return_type DelegateName(Type1 para1, Type2 para2, ... ,[TypeN paraN]);

delegate float DFloatFunc(int val1, float val2); // 定义一个委托类型

委托与事件

事件建立在委托机制之上,通过该机制,某个类在发生某些特定的事情之后,通知其它类或对象正在发生的事情。

事件(委托)

从本质上来说,事件其实就是委托,但是它通常是特定类型的的函数类型,具有以下特点:

事件发行者(类)确定何时引发事件,事件订阅者确定如何响应该事件。

一个事件可以有多个订阅者。一个订阅者可以处理来自多个发行者的多个事件。

没有订阅者的事件,永远不会被调用。

如果一个事件有多个订阅户,当引发该事件时,会同步调用多个事件处理程序。

在.NET类库中,事件是基于EventHandle委托和EventArgs基类的。

事件响应函数委托

其通常没有返回值,有sender 和 arg两个参数。在定义一个事件之前,要先定义事件的参数类型,该类型包含了事件发起者需要提供给事件订阅者的信息。

引发事件

实际上就是调用委托变量。但是在事件被定义之后,该变量默认为null, 直接引发会产生异常,所以调用之前要判断事件是否为null(是否已经被订阅)。通常通过定义OnXXX()的函数来引发XXX事件,在该函数中首先判断事件是否被订阅,如果被订阅则引发该事件。

例:

订阅和处理事件

此方面的一个核心元素是事件响应函数。事件响应函数是符合呀哦订阅的事件委托类型的函数,它通常根据事件的引发者和参数进行相应的处理。

由于事件的本质是委托,所以事件的订阅实际上通过“+=”运算将当前类的事件响应函数添加到时间段额委托链中,在引发事件时就可以调用该处理函数。

C# 委托总结的更多相关文章

  1. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  2. C#基础篇 - 理解委托和事件

    1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...

  3. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  4. [C#] C# 知识回顾 - 委托 delegate

    C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...

  5. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  6. iOS 委托与文本输入(内容根据iOS编程编写)

    文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑  JXHypnosisViewController.m 修改  loadView 方法,向  ...

  7. C#委托异步调用

    参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...

  8. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  9. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  10. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. c#操作剪切板

    C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有: Clear 清除剪切板中的所有数据: ContainsData,Conta ...

  2. **json_encode:让Json更懂中文(JSON_UNESCAPED_UNICODE)

    我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量. 代码如下: <?php echo ...

  3. java使用正则表达式——实例

    Java代码   import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author        Der *  ...

  4. hadoop2.2.0集群搭建与部署

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3818908.html 一.安装环境 1.系统环境 CentOS  6.4 2.集群机器节点ip 节点一i ...

  5. 转:UGUI与NGUI的区别与优缺点

    1. NGUI与UGUI的区别 1) uGUI的Canvas 有世界坐标和屏幕坐标   2) uGUI的Image可以使用material     3) UGUI通过Mask来裁剪,而NGUI通过Pa ...

  6. 保障视频4G传输的流畅性,海康威视摄像头相关设置

    我们目前的rtsp视频解决方案如下: 摄像头<---------->NVR(通过4G上传)<---------->easydarwin<---------->自己的 ...

  7. python 利用pop3接收邮件并保存附件

    def SaveAttach():# login the pop3 server ,retrive the new mails ,and download the attachments dstdir ...

  8. C#基础精华08(反射,程序集)

    什么是程序集? 程序集是.net中的概念. .net中的dll与exe文件都是程序集.(exe与dll的区别?) 程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包( ...

  9. git for windows+TortoiseGit客户端的使用

        一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 : https://code.google.com/p/msysgit/downloads/list?q=full+instal ...

  10. bzoj2436

    不难发现两边的活动是交替进行的,我们可以dp 先对时间离散化,设f[i,j]到时间i一个会场选j个活动,另一个会场最多有多少活动,那么f[i,j]=max(f[k,j]+s[k,i],f[k,j-s[ ...