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

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

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

一、定义事件

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

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

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

1 class Judgment
2 {
3 //定义一个委托
4 public delegate void delegateRun();
5 //定义一个事件
6 public event delegateRun eventRun;
7 }

二、订阅事件

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

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

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

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

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

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

三、引发事件

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

1
2
3
4
public void Begin()
    {
          enentRun();
    }

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

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace Example_EventTest
7 {
8 class Judgment
9 {
10 //定义一个委托
11 public delegate void delegateRun();
12 //定义一个事件
13 public event delegateRun eventRun;
14 //引发事件的方法
15 public void Begin()
16 {
17 eventRun();//被引发的事件
18 }
19 }
20 class RunSports
21 {
22 //定义事件处理方法
23 public void Run()
24 {
25 Console.WriteLine("运动员开始比赛");
26 }
27 }
28 class Program
29 {
30 static void Main(string[] args)
31 {
32 RunSports runsport = new RunSports();//实例化事件发布者
33 Judgment judgment = new Judgment();//实例化事件订阅者
34 //订阅事件
35 judgment.eventRun+=new Judgment.delegateRun(runsport.Run);
36 //引发事件
37 judgment.Begin();
38 Console.ReadKey();
39 }
40 }
41 }

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

转:https://www.cnblogs.com/gq0324/p/8177799.html

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

  1. C#事件-使用事件需要的步骤

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

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

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

  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. Android ToolBar标题文字居中的方法

    在项目的开发中,使用苹果手机的产品,出的界面效果图极有可能(我这里是一定)完全是按照苹果的界面风格来出的,例如界面顶部的title文字位置是水平居中 如图: 那么问题来了,当我们使用ToolBar控件 ...

  2. 转载:SoapUI之接口数据传递

    SoapUI之接口数据传递(TestCase.TestSuite传递) SoapUI之接口数据传递(step传递) SoapUI+Groovy做接口自动化测试 SoapUI中使用Conditional ...

  3. 生物信息之ME, HMM, MEMM, CRF

    原文链接:http://bbs.sciencenet.cn/home.php?mod=space&uid=260809&do=blog&id=573755 注:有少量修改!如有 ...

  4. 怎么看时序图--nand flash的读操作详解 (转)

    这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的.你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令 操作的大概印象,你至少也需要看过 ...

  5. PhotoZoom如何使用调整大小配置文件

      众所周知PhotoZoom是一款图片无失真放大软件,所以在PhotoZoom中会有对尺寸大小调节功能.这里我们所要讲解的也是和尺寸调节等有关的功能——调整大小配置文件. 单击“调整大小配置文件.. ...

  6. springboot-简介

    SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 下载地址: Spring Boot 主要目标是: 为所有 Spring ...

  7. 洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值

    可以将高度定义为小数,这样就完美的解决了优先级的问题. Code: #include<cstdio> #include<algorithm> #include<cstri ...

  8. 路飞学城Python-Day53

    01-jquery的介绍 JS在做项目或者是实现功能的时候,用JS去操作DOM元素非常复杂,代码量大,重复性代码也多 多个元素使用for循环遍历也是非常麻烦的,对于JS使用来说加大了难度 jQuery ...

  9. WTM

    WTM的由来 WalkingTec.Mvvm框架(简称WTM)最早开发与2013年,基于Asp.net MVC3 和 最早的Entity Framework, 当初主要是为了解决公司内部开发效率低,代 ...

  10. 工具-VIM常用快捷键

    使用vs code 的插件 amvim来快速编辑代码,要熟记下面的命令 由normal模式切换到insert模式的命令键 i 在光标左侧输入正文 I 在光标所在行的行首输入正文 a 在光标右侧输入正文 ...