C# 委托总结
总结
委托的本质:
委托是一种特殊的数据类型,它表示某种特定类型的函数,并且可以表示多个函数,将这些函数串联起来。使用委托就好像函数调用一样。
委托实质上是一个类,编译器会根据关键字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# 委托总结的更多相关文章
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- 9、委托、事件、Lambda
开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第 ...
- iOS 委托与文本输入(内容根据iOS编程编写)
文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑 JXHypnosisViewController.m 修改 loadView 方法,向 ...
- C#委托异步调用
参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...
- JavaScript事件代理和委托(Delegation)
JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- Namespace, string, vector and array
1. Headers should not include using declaration Code inside headers ordinarily should not include us ...
- C#图片上写文字
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
- python 时间处理(time和datetime介绍)
python的有关时间的有哪几种呢?今天我们介绍两个:time和datetime time模块提供各种操作时间的函数 datetime模块定义了下面这几个类: datetime.date:表示日期的类 ...
- 利用 __FUNCTION__ 宏打印函数调用信息
__FUNCTION__ 宏表示当前所在函数名: __FILE__ 宏表示当前所在文件路径: __LING__ 宏表示当前所在行: 利用对象离开函数时调用析构函数销毁的特点,打印出函数执行结束的信息 ...
- JavaMail如何保证邮件发送成功
使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?一般的开放的api给我们调用都会有个返回值或者状态码,来告诉我们执行成功与否.但是Java ...
- Netstat 命令
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...
- SQL Server数据库多种方式查找重复记录
摘要:SQL Server是一个关系数据库管理系统,SQL Server数据库的应用是很多的,SQL Server数据库赢得了广大用户的青睐,本文将主要为大家介绍关于SQL Server数据库中查找重 ...
- TCP和UDP协议的应用/参数查看
TCP发送的包有序号,对方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠.一般网页(http).邮件(SMTP).远程连接(Telnet).文件(FT ...
- C++类型转化
dynamic_cast在多继承中可以判断无关类之间是否可以转换,例如基类B1和基类B2之间,static_cast可以在隐式转化及其逆转换中进行,但不允许无关类型之间的转换.,dynamic_cas ...
- CVS 文件自动移 tag 的 Python 脚本
CVS 文件自动移 tag 的 Python 脚本 背景 工作中使用的版本管理工具是 CVS,在两次发布中,如果修改的文件比较少,会选择用移 Tag 的方式来生成一个新 Tag 发布.文件比较少的情况 ...