<接着上一篇事件委托讲解>

.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);
 }
}

 1using System;
 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 事件原理相关推荐

  1. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  2. 【05】制作鸿蒙版蜻蜓短视频系统-事件原理及完成点击,长按,双击等操作实现跳转-优雅草伊凡

    大家好我是伊凡,这是第五篇现在已经开始加快进度了,本次开始熟悉点击事件和各类写法,下一步开始写底部导航和顶部导航,本文为伊凡原创撰写仅仅代表伊凡个人观点,不代表优雅草科技的观点与其立场,谢谢. 点击事 ...

  3. Servlet规范之Listener工作原理

    监听器原理: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 简单的说,被监听对象A中 ...

  4. EventBus的粘性事件原理

    EventBus也称事件总线,根据发送事件的类型分为普通事件和粘性事件. 粘性事件的用法: 1.订阅的时候加上sticky = true @Subscribe(threadMode = ThreadM ...

  5. javascript自定义事件原理

    我们都知道,鼠标点击click,触屏的touch等事件,可以触发相应的事件处理程序,也可以为这些事件添加事件处理程序,实际开发过程中可供我们使用的事件很少,click.doubleclick,mous ...

  6. [Vue源码分析]自定义事件原理及事件总线的实现

    最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道Vue中父组件可以通过 props 向下传数据给子组件:子组件可以通过向$emit触发一个事件,在父组件中执行回调函数,从而实 ...

  7. Javascript常用API及事件原理相关笔记(一)

    1.定义Date日期对象的四种方式及对日期对象进行操作 <!DOCTYPE html> <html lang="en"> <head><m ...

  8. (二)BPMN2.0规范介绍——2事件 Events

    目录 一.事件定义 1. 定时器事件定义 Timer Event Definitions (1)定义 (2)timeDate (3)timeDuration (4)timeCycle (5)ISO 8 ...

  9. [实践篇]13.16 vmm_service监听qvm事件原理及其自定义事件详解

    [QNX Hypervisor 2.2用户手册]目录(完结) 前面通过[实践篇]13.11扒一扒qvm与vmm之间的那点事儿,我们了解到vmm_service通过监听vmm设备节点,来接收qvm的状态 ...

最新文章

  1. Java 异常基础 Exception
  2. 经典面试题-Linux Kernel面试题
  3. systemctl常用命令
  4. 启明云端分享| 在应用启明云端sigmastar SSD201 / SSD202D核心板时,ISP烧录uboot遇到问题怎么解决呢
  5. 使用page-slot显示SAP Spartacus section里包含的Component和layout设计
  6. Python获取两个列表list的不同之处
  7. c语言课本引言课后答案,C语言基础(01-引言及预备知识)作业题
  8. Eclipse用法和技巧四:生成说明文档1
  9. SQL字符串转换为数组
  10. 51Nod 1182
  11. 计算机学院指导报告,重庆大学计算机学院论文指导讲座圆满结束
  12. dd模式和iso模式_ISO的完整形式是什么?
  13. (三)【机器人路径规划】Astar算法
  14. 好看的热力图seaborn.heatmap配色
  15. c语言关于多边形的所有算法,教你如何在C语言中进行点在多边形内算法
  16. 集成Google Play支付
  17. 机械键盘轴体(红轴、茶轴、黑轴、青轴)
  18. python需要电脑多大内存合适_编程用surface怎么样发(学python要多大内存)
  19. 谷歌采用神经网络驱动机器翻译,可离线翻译59种语言
  20. 博弈论——非合作博弈 什么是纳什均衡

热门文章

  1. [小程序]微信小程序登陆并获取用户信息
  2. BZOJ2631: tree
  3. [Oracle 学习] Oracle中将查询语句执行结果导入文本文件
  4. 我的奔腾B50 MT豪华版 典雅灰 – 验车篇
  5. JSON的C语言编解码器——cJSON和json-c
  6. s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)
  7. 【AWSL】之Linux管理(RPM)程序
  8. matpython_[mcj]使用Matlab/Python合并mat文件并存为mat
  9. python使用ddt_python使用ddt模块对用例执行操作
  10. python 用if判断一个数是不是整数_五天学会Python基础02(下)