规范的.net 事件原理
<接着上一篇事件委托讲解>
.net framework 事件设计准则
1 声明delegate时,使用void 类型当作返回值,EventName事件的事件委托是
EventNameEventHandler,事件接受两个传入参数,一律命名为sender和e。
2 定义一个提供事件数据的类。对类以EventNameEventArgs进行命名,从system.EventArgs派生该
类,然后添加所有事件特定的成员
public delegate void EventNameEventHandler(object sender,EventNameEventArgs e);
EventNameEventArgs用于封装事件的多个参数,这个类可以自己写但必须继承EventArgs
class EventNameEventArgs:EventArgs
{
...
}
3 在引发事件的类中提供一个手保护的方法,以OnEventName进行命名。在该方法中引发事件
protected virtual void OnEventName(EventArgs e)
{
if(EventName!=null)
{
EventName(this,e);
}
}
2using System.Collections.Generic;
3
4namespace event3
5{
6 class PubEventArgs:EventArgs//提供事件所需要的数据
7 {
8 private readonly string m_magazineName;
9 private readonly DateTime m_pubDate;
10 public PubEventArgs(string magazineName,DateTime pubDate)
11 {
12 this.m_magazineName=magazineName;
13 this.m_pubDate=pubDate;
14 }
15 public string magazineName
16 {
17 get{return m_magazineName;}
18 }
19 public DateTime pubDate
20 {
21 get{return m_pubDate;}
22 }
23 }
24
25 class Publisher //出版社
26 {
27 public delegate void PubComputerEventHandler(object sender,PubEventArgs e); //事件所需的代理 委托是种类
28 public delegate void PubLifeEventHandler(object sender,PubEventArgs e);
29 public event PubComputerEventHandler PubComputer=null;//事件的声明
30 public event PubLifeEventHandler PubLife=null;
31
32 protected virtual void OnPubComputer(PubEventArgs e)
33 {
34 PubComputerEventHandler handler=PubComputer; //临时委托变量
35 if(handler!=null)
36 {
37 handler(this,e);
38 }
39 }
40
41 protected virtual void OnPubLife(PubEventArgs e)
42 {
43 PubLifeEventHandler handler=PubLife; //临时委托变量
44 if(handler!=null)
45 {
46 handler(this,e);
47 }
48 }
49
50 public void issuComputer(string magazineName,DateTime pubDate) //触发订阅电脑杂志事件的方法
51 {
52 Console.WriteLine("发行"+magazineName);
53 OnPubComputer(new PubEventArgs(magazineName,pubDate));
54 Console.ReadLine();
55 }
56
57 public void issuLife(string magazineName,DateTime pubDate)
58 {
59 Console.WriteLine("发行"+magazineName);
60 OnPubLife(new PubEventArgs(magazineName,pubDate));
61 Console.ReadLine();
62 }
63 }
64
65 class Subscriber //订阅者
66 {
67 private string name;
68 public Subscriber(string name)
69 {
70 this.name=name;
71 }
72 public void Receive(object sender,PubEventArgs e)//在事件订阅者中定义事件处理程序
73 {
74 Console.WriteLine(e.pubDate+" "+name+"已经收到了"+e.magazineName);
75 }
76 }
77
78 class Story //故事发生在订阅者和出版社之间
79 {
80 static void Main()
81 {
82 Publisher Pub=new Publisher();
83 Subscriber zs=new Subscriber("张三");
84 Pub.PubLife+=new Publisher.PubLifeEventHandler(zs.Receive);//张三订阅生活杂志
85 Subscriber ls=new Subscriber("李四");//李四也订阅了电脑、生活杂志
86 Pub.PubComputer+=new Publisher.PubComputerEventHandler(ls.Receive);
87 Pub.PubLife+=new Publisher.PubLifeEventHandler(ls.Receive);
88 Pub.issuComputer("《电脑》杂志",Convert.ToDateTime("2008-11-28")); //收到事件后做出的处理
89 Pub.issuLife("《生活》杂志",Convert.ToDateTime("2008-11-28"));
90 //一年后李四由于经济危机取消了《生活》杂志的订阅
91 Console.WriteLine("一年后李四由于经济危机取消了《生活》杂志的订阅");
92 Pub.PubLife-=new Publisher.PubLifeEventHandler(ls.Receive);
93 Pub.issuComputer("《电脑》杂志",Convert.ToDateTime("2009-11-28"));
94 Pub.issuLife("《生活》杂志",Convert.ToDateTime("2009-11-28"));
95 }
96 }
97}
转载于:https://www.cnblogs.com/hemood/archive/2008/11/27/1342639.html
规范的.net 事件原理相关推荐
- Android Touch事件原理加实例分析
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
- 【05】制作鸿蒙版蜻蜓短视频系统-事件原理及完成点击,长按,双击等操作实现跳转-优雅草伊凡
大家好我是伊凡,这是第五篇现在已经开始加快进度了,本次开始熟悉点击事件和各类写法,下一步开始写底部导航和顶部导航,本文为伊凡原创撰写仅仅代表伊凡个人观点,不代表优雅草科技的观点与其立场,谢谢. 点击事 ...
- Servlet规范之Listener工作原理
监听器原理: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 简单的说,被监听对象A中 ...
- EventBus的粘性事件原理
EventBus也称事件总线,根据发送事件的类型分为普通事件和粘性事件. 粘性事件的用法: 1.订阅的时候加上sticky = true @Subscribe(threadMode = ThreadM ...
- javascript自定义事件原理
我们都知道,鼠标点击click,触屏的touch等事件,可以触发相应的事件处理程序,也可以为这些事件添加事件处理程序,实际开发过程中可供我们使用的事件很少,click.doubleclick,mous ...
- [Vue源码分析]自定义事件原理及事件总线的实现
最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道Vue中父组件可以通过 props 向下传数据给子组件:子组件可以通过向$emit触发一个事件,在父组件中执行回调函数,从而实 ...
- Javascript常用API及事件原理相关笔记(一)
1.定义Date日期对象的四种方式及对日期对象进行操作 <!DOCTYPE html> <html lang="en"> <head><m ...
- (二)BPMN2.0规范介绍——2事件 Events
目录 一.事件定义 1. 定时器事件定义 Timer Event Definitions (1)定义 (2)timeDate (3)timeDuration (4)timeCycle (5)ISO 8 ...
- [实践篇]13.16 vmm_service监听qvm事件原理及其自定义事件详解
[QNX Hypervisor 2.2用户手册]目录(完结) 前面通过[实践篇]13.11扒一扒qvm与vmm之间的那点事儿,我们了解到vmm_service通过监听vmm设备节点,来接收qvm的状态 ...
最新文章
- Java 异常基础 Exception
- 经典面试题-Linux Kernel面试题
- systemctl常用命令
- 启明云端分享| 在应用启明云端sigmastar SSD201 / SSD202D核心板时,ISP烧录uboot遇到问题怎么解决呢
- 使用page-slot显示SAP Spartacus section里包含的Component和layout设计
- Python获取两个列表list的不同之处
- c语言课本引言课后答案,C语言基础(01-引言及预备知识)作业题
- Eclipse用法和技巧四:生成说明文档1
- SQL字符串转换为数组
- 51Nod 1182
- 计算机学院指导报告,重庆大学计算机学院论文指导讲座圆满结束
- dd模式和iso模式_ISO的完整形式是什么?
- (三)【机器人路径规划】Astar算法
- 好看的热力图seaborn.heatmap配色
- c语言关于多边形的所有算法,教你如何在C语言中进行点在多边形内算法
- 集成Google Play支付
- 机械键盘轴体(红轴、茶轴、黑轴、青轴)
- python需要电脑多大内存合适_编程用surface怎么样发(学python要多大内存)
- 谷歌采用神经网络驱动机器翻译,可离线翻译59种语言
- 博弈论——非合作博弈 什么是纳什均衡
热门文章
- [小程序]微信小程序登陆并获取用户信息
- BZOJ2631: tree
- [Oracle 学习] Oracle中将查询语句执行结果导入文本文件
- 我的奔腾B50 MT豪华版 典雅灰 – 验车篇
- JSON的C语言编解码器——cJSON和json-c
- s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)
- 【AWSL】之Linux管理(RPM)程序
- matpython_[mcj]使用Matlab/Python合并mat文件并存为mat
- python使用ddt_python使用ddt模块对用例执行操作
- python 用if判断一个数是不是整数_五天学会Python基础02(下)