事件是C#中另一高级概念,使用方法和委托相关。奥运会参加百米的田径运动员听到枪声,比赛立即进行。其中枪声是事件,而运动员比赛就是这个事件发生后的动作。不参加该项比赛的人对枪声没有反应。

从程序员的角度分析,当裁判员枪声响起,发生了一个事件,裁判员通知该事件发生,参加比赛的运动员仔细听枪声是否发生。运动员是该事件的订阅者,没有参赛的人不会注意,即没有订阅该事件。

C#中使用事件需要的步骤:
1、创建一个委托;
2、将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联C#事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名);
3、编写C#事件处理程序;
4、利用编写的C#事件处理程序生成一个委托实例;
5、把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。

一、定义事件

定义事件时,发生者首先要定义委托,然后根据委托定义事件。定义事件的语法如下:

<访问修饰符> event 委托名 事件名;

定义事件时,一定要有一个委托类型,用这个委托类型来定义处理事件的方法类型。下面定义一个发布者类,并在其内部定义eventRun事件。

 class Judgment
{
//定义一个委托
public delegate void delegateRun();
//定义一个事件
public event delegateRun eventRun;
}

二、订阅事件

定义好事件后,与事件有关的人会订阅事件,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知。订阅事件的语法如下:

事件名+=new 委托名(方法名);

假如方法名为Run,那么订阅事件eventRun的代码如下:

judgment.eventRun+=new Judgment.delegateRun(runsport.Run);

judgment为类Judgment的对象,runsport为运动员类RunSports的对象,Run为其中的方法。

事件的订阅通过“+=”操作符来实现,可以给事件加一个或多个方法委托。

三、引发事件

一般都是在满足某个条件下引发事件,裁判员枪声一响,引发运动员奔跑这个事件。在编程中可以用条件诘句,也可以使用方法引发事件。

  public void Begin()
{
enentRun();
}

这段代码中,通过Begin方法引发事件enentRun。引发事件的语法与调用方法的语法相同,引发该事件时,将调用订阅事件的对象的所有委托。下面代码演示裁判员枪声响起到引发运动员比赛的动作,完整代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Example_EventTest
{
class Judgment
{
//定义一个委托
public delegate void delegateRun();
//定义一个事件
public event delegateRun eventRun;
//引发事件的方法
public void Begin()
{
eventRun();//被引发的事件
}
}
class RunSports
{
//定义事件处理方法
public void Run()
{
Console.WriteLine("运动员开始比赛");
}
}
class Program
{
static void Main(string[] args)
{
RunSports runsport = new RunSports();//实例化事件发布者
Judgment judgment = new Judgment();//实例化事件订阅者
//订阅事件
judgment.eventRun+=new Judgment.delegateRun(runsport.Run);
//引发事件
judgment.Begin();
Console.ReadKey();
}
}
}

Judgment类为事件发布者,RunSports类为事件订阅者。引发事件的方法为Begin();。一个事件可以有多个订阅者,事件的发布者也可以是事件的订阅者。

C#事件-使用事件需要的步骤的更多相关文章

  1. Cognos事件工作室Event Studio开发步骤

    Cognos本身是很强大的,只是很多人的思维只是局限在数据-模型-展示的层面上,下面我们就来介绍一下Cognos中稍微有些冷门的一个组件事件工作室(IBM Cognos Event Studio),概 ...

  2. [转]C#事件-使用事件需要的步骤

    事件是C#中另一高级概念,使用方法和委托相关.奥运会参加百米的田径运动员听到枪声,比赛立即进行.其中枪声是事件,而运动员比赛就是这个事件发生后的动作.不参加该项比赛的人对枪声没有反应. 从程序员的角度 ...

  3. 如何给ActiveX控件添加“事件”“属性”“标准事件”“自定义事件”等一些相关操作

    上一篇小编带大家熟悉了一下ActiveX的建立以及相关的概念,(http://blog.csdn.net/u014028070/article/details/38424611) 本文介绍下如何给控件 ...

  4. JavaScript 事件——“模拟事件”的注意要点

    DOM中的事件模拟 三个步骤: 首先通过document.createEvent()方法创建event对象,接收一个参数,即表示要创建的事件类型的字符串: UIEvents(DOM3中的UIEvent ...

  5. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  6. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  7. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  8. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  9. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

随机推荐

  1. a标签点击跳转失效--IE6、7的奇葩bug

    一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...

  2. servlet文件下载

    创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...

  3. C#学习资源

    # 视频 C#程序设计 Cousera(推荐) # 文档 C#教程 MSDN Microsoft API 和参考目录

  4. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  5. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  6. .NET Core的日志[1]:采用统一的模式记录日志

    记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断框架(相关A ...

  7. jQuery学习之路(4)- 动画

    ▓▓▓▓▓▓ 大致介绍 通过jQuery中基本的动画方法,能够轻松地为网页添加非常精彩的视觉效果,给用户一种全新的体验 ▓▓▓▓▓▓ jQuery中的动画 ▓▓▓▓▓▓ show()和hide()方法 ...

  8. C# 自定义控件VS用户控件

    1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...

  9. Node.js入门

    开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...

  10. 实现php连接memcached

    准备工作: 实现lnmp环境 给php添加模块,so库 下载扩展包:memcache-2.2.5.tgz wget http://pecl.php.net/get/memcache-2.2.5.tgz