例说.NET事件的使用

2024-04-02 19:18
文章标签 使用 事件 net 例说

本文主要是介绍例说.NET事件的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 概要

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


二 实例演示

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

 

图1 程序结构图

新建教师类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!”。

 

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

 

图3 程序运行效果图

 

三 总结

1 事件是基于委托的。

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

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

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

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

这篇关于例说.NET事件的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870831

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图