C#的委托与C++的函数指针类似,但委托是类型安全的,意味着指针始终会指向有效的函数。委托的使用主要有两种:回调和事件。

一 将委托作为回调函数

在需要给一个函数传递一个函数指针,随后通过函数指针调用函数时,就可以使用回调函数的方式。回调函数经常用于异步编程,如果被调用的方法执行起来比较费时,就可以把这个方法放在单独在线程执行,同时将函数指针交给回调函数,线程结束时再调用回调函数。这样调用者就不必因等待执行起来费时的方法而被阻塞了。

a) 举例,有一个数据库管理类DBManager,这个类追踪所有激活的数据库连接DBConnection,并通过EnumConnections()方法可以遍历输出这些连接。假设DBManager运行在远程服务器上,那么最好异步执行EnumConnections方法,并使用回调函数接收结果。

DBConnection类如下:

DBManager类如下:

这里声明了委托EnumConnectionsCallback,方法签名为无返回值、有一个DBConnection参数,在调用EnumConnections方法时,传递EnumConnectionsCallback类型的函数指针。

然后调用代码写法如下:

函数指针指向了ActiveConnectionsCallBack方法,这个方法与定义的委托具有相同的签名。

b) 每次调用EnumConnections方法时都需要实例化EnumConnectionsCallback,这样使用起来很不方便,那么就可以将myCallBack修饰为静态的,方便每次直接使用。

c) 关于回调函数的命名规范,通用的做法是以Callback结尾,但有时委托本身往往也经常以Callback结尾,这时需要注意区分二者,因为回调函数属于方法,而委托属于类,如果二者混淆,会导致编译错误。

d) 委托的初始化往往比较耗费时间和资源,而且并不能保证初始化后一定会被用到,于是可以延迟其初始化,只有在开始使用前,才进行初始化,使用只读属性可以实现这个思路

e) 如果需要同时使用多个委托,该如何做呢,比如有一个库存管理类一旦商品数量低于警戒值,一方面会记录日志,另一方面会发邮件给相关人员。主要改变的地方在初始化委托,将两个委托加起来赋值给callback。

而且两个回调执行的顺序是按照相加的顺序的。还可以使用减号解除某个回调。

f) Windows系统有许多场合用到了事件,如消息队列、用户交互等。C#中的事件遵循发布-订阅(观察者)模式,一个消息源可以被多个对象订阅。事件是特殊的委托,这种委托必须有两个参数,第一个参数为发布者或者说事件的触发者,第二个参数为派生自EventArgs的对象。

学习资料:Inside C# by Tom Archer

《Inside C#》笔记(十二) 委托与事件的更多相关文章

  1. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  2. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  3. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  4. DirectX11笔记(十二)--Direct3D渲染8--EFFECTS

    原文:DirectX11笔记(十二)--Direct3D渲染8--EFFECTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737 ...

  5. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  6. .NET面试题系列(十)委托与事件

    委托 有了委托的存在,使得方法可以作为参数传递给另一个方法. int Max(int x,int y) { return x>y?x:y; } int Min(int x,int y) { re ...

  7. 《深入理解Java虚拟机》读书笔记十二

    第十二章  Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...

  8. Unity3D笔记十六 输入输出-键盘事件、鼠标事件

    输入与控制操作Unity为开发者提供了Input类库,其中包括键盘事件.鼠标事件和触摸事件等一切跨平台所需要的控制事件. 一.键盘事件 1.按下事件 Input.GetKeyDown():如果按键被按 ...

  9. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

随机推荐

  1. spring 原理1:java 模拟springIOC容器

    本篇博客主要是使用java代码模拟spring的IOC容器,实现依赖注入:当然只是模拟spring容器中简单的一点实现原理而已,加深一些自己对spring框架的底层原理的理解: 使用的技术:dom4j ...

  2. PHP、JS、Python,数据库 获取今天是星期几了?[开发篇]

    额,这个看起来是一个好简单的问题,但是真正到自己去一行行写的时候,又给忘了,妈蛋.有空就看看吧.今天是星期几?下面就来看看几种不同语言的实现吧! PHP语言 输出当前时间: echo date('Y- ...

  3. 一致性hash理解、拜占庭将军问题解读和CAP理论总结

    一致性hash理解 白话概述: 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号.这是正常的hash算法分散图片存储.但是有一天, ...

  4. Linux下Clamav 杀毒软件安装使用文档

    一.安装Clamav杀毒工具 0.安装Clamav需要的依赖包 yum install libxml* openssl* -y 1.创建clamav组 groupadd clamav 2.创建clam ...

  5. 国外青少年最喜爱的聊天 app,竟然是 Google Docs

    简评: 这还真不是标题党,Google Docs 的协作中内置了实时聊天的功能,也可以进行 comments,颇有种现代「传纸条」的既视感.其实国内的石墨文档.腾讯文档等协作工具也有类似的效果,本文很 ...

  6. python unittest单元测试

    unittest单元测试框架:包含测试用例编写.测试收集\测试用例加载.执行测试用例.生成测试用例报告,同时,更提供了添加断言,异常处理等. 第一:创建测试类,创建测试用例 第二:收集测试用例,加载测 ...

  7. Oracle 插入时间时 报错:ORA-01861: 文字与格式字符串不匹配 的解决办法

    一.写sql的方式插入到Oracle中 往oracle中插入时间  '2007-12-28 10:07:24'如果直接按照字符串方式,或者,直接使用to_date('2007-12-28 10:07: ...

  8. yarn依赖管理工具,和fis3构建工具 gulp详细用法

    看视频所了解到的,正在进行摸索. 参考:https://www.cnblogs.com/2050/p/4198792.html这篇介绍gulp的文章非常棒,唯一有一点,页面随时刷新的目前还没实现,不知 ...

  9. logrotate实现Mysql慢日志分割

    MySQL慢日志? MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询 ...

  10. simhash文章排重

    原文链接:https://www.cnblogs.com/baochuan/p/9089244.html  背景     提升产品体验,节省用户感知度.——想想,如果看到一堆相似性很高的新闻,对于用户 ...