例说.NET事件的使用

一 概要

本文通过实例介绍了.NET事件的使用方法。

二 实例演示

1 新建Windows应用程序EventExp,程序结构如下图所示。

图1 程序结构图

2 新建教师类Teacher(类文件为Teacher.cs),Teacher类为事件发布者。

Teacher类的详细代码如下所示。

//************************************************************
//
// CLR事件示例代码
//
// Author:三五月儿
//
// Date:2014/08/31
//
// http://blog.csdn.net/yl2isoft
//
//************************************************************
using System;
using System.Windows.Forms;

namespace EventExp
{
    public class Teacher
    {
        public Teacher (){}

        public event EventHandler<AskEventArgs> Ask;
        public void Raise()
        {
            MessageBox.Show("MrWang:Who is on duty today?");
            RaiseDutyInfo();
        }
        private void RaiseDutyInfo()
        {
            EventHandler<AskEventArgs> ask = Ask;
            if (ask != null)
            {
                ask(this, new AskEventArgs());
            }
        }
    }
    public class AskEventArgs : EventArgs
    {
    }
}

Teacher类中定义类型为EventHandler<AskEventArgs>的事件Ask,该事件在方法RaiseDutyInfo中触发,在事件被触发前会向窗体弹出"MrWang:Who is on duty today?”的消息框。

查看EventHandler<AskEventArgs>类型的定义,如下所示:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

从定义中可以了解到,EventHandler<AskEventArgs>本质上是一个委托,该委托使用带两个参数且不具有返回值的方法,第一个参数是包含事件发布者的对象,而第二个参数提供与事件相关的信息,该参数必须派生自EventArgs类,本实例中不需要提供任何与事件相关的信息,所以AskEventArgs类不包含任何实现代码。本例中使用的EventHandler<AskEventArgs>由.NET定义,当然我们也可以自己定义所需的事件类型,关于这点等以后有机会再探讨。

3 新建学生类Student(类文件为Student.cs),Student类为事件的订阅者。

Student类的详细代码如下所示。

//************************************************************
//
// CLR事件示例代码
//
// Author:三五月儿
//
// Date:2014/08/31
//
// http://blog.csdn.net/yl2isoft
//
//************************************************************
using System.Windows.Forms;

namespace EventExp
{
    public class Student
    {
        private string name;
        private bool isOnDuty;
        public Student(string name, bool isOnDuty)
        {
            this.name = name;
            this.isOnDuty = isOnDuty;
        }
        public void Answer(object sender, AskEventArgs e)
        {
            if (isOnDuty)
            {
                MessageBox.Show(string.Format("{0}:{0} is on duty today!", name, name));
            }
            else
            {
                MessageBox.Show(string.Format("{0}:{0} is not on duty today!", name, name));
            }
        }
    }
}

Student类的Answer方法满足EventHandler<AskEventArgs>委托的要求,所以该方法可以作为Teacher类的Ask事件的事件处理方法。

4 程序的主画面如下图所示。

图2 程序主画面

程序主画面的后端代码如下所示。

//************************************************************
//
// CLR事件示例代码
//
// Author:三五月儿
//
// Date:2014/08/31
//
// http://blog.csdn.net/yl2isoft
//
//************************************************************  

using System;
using System.Windows.Forms;

namespace EventExp
{
    public partial class Form1 : Form
    {
        Student zhangSan;
        Student liSi;
        Student wangWu;
        Student tiana;
        Teacher mrWang;

        public Form1()
        {
            InitializeComponent();

            zhangSan = new Student("张三", true);
            liSi = new Student("李四", true);
            wangWu = new Student("王五", true);
            tiana = new Student("三五月儿", false);
            mrWang = new Teacher();
            //订阅事件
            mrWang.Ask += zhangSan.Answer;
            mrWang.Ask += liSi.Answer;
            mrWang.Ask += wangWu.Answer;
            mrWang.Ask += tiana.Answer;
            //取消订阅事件
            mrWang.Ask -= liSi.Answer;
            mrWang.Ask -= wangWu.Answer;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            mrWang.Raise();
        }
    }
}

在Form1类中,实例化Student类,得到学生对象zhangSan、liSi、wangWu及tiana,先让所有学生对象都订阅Teacher对象mrWang的Ask事件,随后取消liSi与wangWu两位同学的事件订阅。这样一来,mrWang的Ask事件被触发后,zhangSan和tiana将会执行自己的事件处理方法,而liSi与wangWu将不会,因为他们无法感知到mrWang的Ask事件的发生。zhangSan和tiana在自己的事件处理方法中,会弹出消息框,显示“zhangSan:zhangSan is on duty today!”和“三五月儿:三五月儿 is not on duty today!”。

5 程序运行后的效果如下图所示,与第4步的分析结果保持一致。

图3 程序运行效果图

三 总结

1 事件是基于委托的。

2 事件编程模型包含事件发布者,事件订阅者以及两者之间的订阅关系三部分。

3 事件编程模型是观察者模式的一种实现。

4 使用事件编程模型一般包含以下几步:

  • 定义事件的类型参数(AskEventArgs类)
  • 定义事件发布者的类(Teacher类)
  • 在事件发布者的类中定义事件(Teacher类的Ask事件)
  • 在事件发布者的类中定义事件通知方法,事件将在该方法中被触发,方法被触发后会去执行事件处理方法(Teacher类的RaiseDutyInfo方法)
  • 定义事件订阅者的类(Student类)
  • 在事件订阅者的类中定义事件处理方法,该方法的定义必须满足事件使用的委托的定义一致(Student类的Answer方法)
  • 订阅事件(Form1中通过“+=”和“-=”完成事件的订阅及取消订阅的操作)
时间: 2024-10-06 21:00:29

例说.NET事件的使用的相关文章

Swift - 触摸事件(点击,移动,抬起等)说明及用例

在iOS开发中,UIGestureRecognizer可以方便的响应处理手势事件. 而如果要想更精细的处理,我们还需要借助touchesBegan,touchesMoved,touchesEnded等触摸方法.这些方法 都是UIResponder中的方法.视图控制器和视图类,都是UIResponder的子类.正是这个类,让UIView等相关触摸事件得以响应. 具体方法介绍如下: 1,func touchesBegan(touches: NSSet, withEvent event: UIEven

WPF自定义路由事件

一 概要 本文通过实例演示WPF自定义路由事件的使用,进而探讨了路由事件与普通的CLR事件的区别(注:"普通的CLR事件"这个说法可能不太专业,但是,我暂时也找不到什么更好的称呼,就这么着吧,呵呵.)(扩展阅读:例说.NET事件的使用). 二 实例演示与说明 1 新建DetailReportEventArgs类,该类派生自RoutedEventArgs类,RoutedEventArgs类包含与路由事件相关的状态信息和事件数据.DetailReportEventArgs类中定义了属性Ev

第13章 事件

JavaScript 与HTML 之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软件工程中被称为观察员模式的模型,支持页面的行为(JavaScript 代码)与页面的外观(HTML 和CSS 代码)之间的松散耦合. 13.1 事件流 事件流描述的是从页面中接收事件的顺序.IE 的事件流是事件冒泡流,而Netscape Communicator 的事件流是事件捕获流. 13.1.1

探究JavaScript中的五种事件处理程序

我们知道JavaScript与HTML之间的交互是通过事件实现的.事件最早是在IE3和Netscape Navigator 2中出现的,当时是作为分担服务器运算负载的一种手段. 通俗地理解,事件就是用户或浏览器自身执行的某种操作.而事件处理程序即为响应某个事件的函数.抽出主干,即事件处理程序为函数.  我们又把事件处理程序称为事件侦听器.  事件处理程序是以"on"开头的,因此对于事件on的时间处理程序即为onclick.时间处理程序在JavaScript中大致有五种,下面会根据这五种

Event 事件

驱动事件三要素: 1.事件源:即触发事件的元素 2.事件:被 JavaScript 监测到的行为. 3.事件处理函数:事件发生时要进行的操作,?又叫做"事件句柄"或"事件监听?" 事件绑定: 1.HTML 标签的事件属性:这种?方式 HTML 代码和 JavaScript 逻辑不能很好地分离,所以不建议使用. 2.DOM 标准的事件:这种方式只能为指定的?个标签绑定一个事件,并且只能具有?个事件处理函数. 参数说明:      1.eventName :为元素指定具

微信小程序之触控事件(四)

>>>什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如id, dataset, touches. >>>事件分类 touchstart 手指触摸 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如弹窗和来电提醒 touchend 手指触摸动作结束 tap 手指触摸后离开 longtap 手指触摸

一个demo让你彻底理解Android触摸事件的并发

注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOWN.ACTION_MOVE.ACTION_UP.当用户手指接触屏幕时,便产生一个动作为ACTION_DOWN的触摸事件,此时若用户的手指立即离开屏幕,会产生一个动作为ACTION_UP的触摸事件:若用户手指接触屏幕后继续滑动,当滑动距离超过了系统中预定义的距离常数,则产生一个动作为ACTION_MO

μCOS-II系统之事件(event)的使用规则及MUTEX实例

*************************************************************************************************************************** 作者:EasyWave                                                时间:2014.05.31 类别:μC/OS-II-操作系统                                  声明:

面向对象基础——事件和委托

事件和委托 在典型的面向对象软件的一般流程中,代码段创建类的对象并在该对象上调用力法.在这种情况下,调用程序是主动代码,因为它们是调用方法的代码.而对象是被动的,因为只有当某种方法被调用时才会用上对象并执行某种动作. 然而,也可能存在相反的情况.对象可以执行一些任务并在执行过程中发生某些事情时通知调用程序.称这类事情为事件(event),对象的事件发布称为引发事件. 事件驱动处理对于.NET来说并不是什么技术,在事件驱动处理中,当有事件发生时,某些代码段会通知其他对事件感兴趣的代码段.当用户使用