《Inside C#》笔记(十二) 委托与事件
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#》笔记(十二) 委托与事件的更多相关文章
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- DirectX11笔记(十二)--Direct3D渲染8--EFFECTS
原文:DirectX11笔记(十二)--Direct3D渲染8--EFFECTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737 ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- .NET面试题系列(十)委托与事件
委托 有了委托的存在,使得方法可以作为参数传递给另一个方法. int Max(int x,int y) { return x>y?x:y; } int Min(int x,int y) { re ...
- 《深入理解Java虚拟机》读书笔记十二
第十二章 Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...
- Unity3D笔记十六 输入输出-键盘事件、鼠标事件
输入与控制操作Unity为开发者提供了Input类库,其中包括键盘事件.鼠标事件和触摸事件等一切跨平台所需要的控制事件. 一.键盘事件 1.按下事件 Input.GetKeyDown():如果按键被按 ...
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...
随机推荐
- linux下把动态链接库加入环境变量的几种方式
一. 将网络SDK各动态库路径加入到LD_LIBRARY_PATH环境变量 1.在终端输入:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX 只在当前终端起作用 ...
- 可变码率(英语:Variable bitrate,简称VBR)介绍
可变码率(英语:Variable bitrate,简称VBR)这是一个用来形容通信服务质量(QoS for Quality of Service)的术语.和该词相对应的词是固定码率或固定比特率,英文c ...
- Linux - 基础命令汇总
珠玉在前,不再赘言. 60个命令 对Linux新手非常有用的20个命令 对中级Linux用户非常有用的20个命令 对Linux专家非常有用的20个命令 一些技巧 最实用的 Linux 命令行使用技巧 ...
- Python基础教程(第3版) 笔记(一)
1.1 数和表达式: 除法运算的结果为小数,即浮点数 >>>1/2 0.5 除法运算为整数,使用双斜杠 >>>1//2 0 >>>5.0//2.4 ...
- python基础学习笔记 - 备忘
基础中的基础 Python标识符 命名规则: Python标识符区分大小写. 可以包括英文.数字以及下划线,但不能以数字开头. 以下划线开头的标识符是有特殊意义的: a) 以单下划线开 ...
- jquery的contains方法
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- .NET Core 2.0 Preview 1发布下载和文档
.NET Core 2.0.0 Preview 1 发布于 2017 5.10. 你可以通过 Visual Studio 2017 Preview 15.3, Visual Studio for Ma ...
- 理解Array.prototype.fill和Array.from
之所以将这两个方法放在一起说,是因为经常写这样的代码: Array.from({length: 5}).fill(0),看起来很简洁,但是踩到坑之后才发现自己对这两个方法实在是不求甚解. Array. ...
- 在centos和redhat上安装docker
前置条件 64-bit 系统 kernel 3.10+一.检查内核版本,返回的值大于3.10即可 $ uname -r 二.使用 sudo 或 root 权限的用户登入终端 三.卸载旧版本(如果安装过 ...
- Ajax之跨域访问与JSONP
前言 同源策略的限制,使得ajax无法发出跨域请求.在许多情况下,我们需要让ajax支持跨域.以下是其中一种解决方案(JSONP).JSONP解决了跨域数据访问的问题. 在html中,具有src属性的 ...