总结

委托的本质:

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

委托实质上是一个类,编译器会根据关键字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. Namespace, string, vector and array

    1. Headers should not include using declaration Code inside headers ordinarily should not include us ...

  2. C#图片上写文字

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...

  3. python 时间处理(time和datetime介绍)

    python的有关时间的有哪几种呢?今天我们介绍两个:time和datetime time模块提供各种操作时间的函数 datetime模块定义了下面这几个类: datetime.date:表示日期的类 ...

  4. 利用 __FUNCTION__ 宏打印函数调用信息

    __FUNCTION__ 宏表示当前所在函数名: __FILE__ 宏表示当前所在文件路径: __LING__ 宏表示当前所在行: 利用对象离开函数时调用析构函数销毁的特点,打印出函数执行结束的信息 ...

  5. JavaMail如何保证邮件发送成功

    使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否.但是Java ...

  6. Netstat 命令

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...

  7. SQL Server数据库多种方式查找重复记录

    摘要:SQL Server是一个关系数据库管理系统,SQL Server数据库的应用是很多的,SQL Server数据库赢得了广大用户的青睐,本文将主要为大家介绍关于SQL Server数据库中查找重 ...

  8. TCP和UDP协议的应用/参数查看

    TCP发送的包有序号,对方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠.一般网页(http).邮件(SMTP).远程连接(Telnet).文件(FT ...

  9. C++类型转化

    dynamic_cast在多继承中可以判断无关类之间是否可以转换,例如基类B1和基类B2之间,static_cast可以在隐式转化及其逆转换中进行,但不允许无关类型之间的转换.,dynamic_cas ...

  10. CVS 文件自动移 tag 的 Python 脚本

    CVS 文件自动移 tag 的 Python 脚本 背景 工作中使用的版本管理工具是 CVS,在两次发布中,如果修改的文件比较少,会选择用移 Tag 的方式来生成一个新 Tag 发布.文件比较少的情况 ...