事件第二篇:https://www.cnblogs.com/FavoriteMango/p/11731485.html

  曾经面试碰到一道设计题:

  现有一个人,一群鸟,人有一把手枪,当人开枪时,所有的鸟都被吓飞了。要求按照题干设计程序且有一定的扩展性。

当时我并无任何的程序设计知识,看到该题一点解决办法也没有,按照面向过程完全可以写流程出来,但“光写流程”并不符合C#面向对象的的思想,写出来也不具有任何扩展性。

直到后来学习了事件的相关知识,可能目前仍然不清楚如何扩展,但至少可以写个像模像样的程序出来。

1.事件的组成

事件的组成分为5个部分:

(1)事件的拥有者

(2)事件本身

(3)事件的订阅者

(4)事件处理器

(5)订阅事件

  事件的拥有者,或者说这件事的发起者,以上题为例,人开枪,人便是发起事件的对象,是事件的拥有者;事件的本身,开枪这件事便是事情的本身;事件的订阅者,也就是关注事件发生的对象,题中开枪后鸟都飞走了,鸟是听到枪响才飞走的,也就是说鸟是关注“开枪”这件事的对象;事件处理器,订阅者在关注到事件发生后,针对事件作出的反应。鸟在枪响后都被吓得飞走了,“飞走”便是它们针对“开枪”作出的事件处理。此外,事件的发生和事件处理都是一种动作,两者紧密相连却又互不相同,在处理事件的逻辑时一定要分清二者的界限,切不可混为一谈而导致逻辑混乱;而订阅事件,这实际是一种关系,这个关系是联系拥有者和订阅者、事件和事件处理的一个“纽带”。就好比你家里做好了饭,家里人通知你饭做好了,你知道要开饭了于是赶紧回家,因为你是“关注”家里“开饭”这件事的,这便是订阅事件。

2.事件的使用

  定义事件的关键字是event,并且事件定义时需要搭配委托,语法:修饰符 + event + 委托类型 + 名称。

  事件的触发只能在被声明该事件的类中进行,语法与类方法调用相同,所以事件是不能直接在类体之外触发的,若想在程序的其他地方触发方法,必须要用类方法在类体中封装事件。

  事件的订阅需要用到“+=”操作符,语法:实体类名称.事件 += 方法(事件处理器)。由于事件依托委托来声明,所以一个事件可以挂接多个事件处理器,也就是说可以被多个对象订阅。

  回到题目,理清楚题目中的对象分别对应组成事件的哪个部分,人是事件的发起者、开枪是事件本身,鸟是事件的订阅者,它订阅了开枪这件事,而飞走是它对开枪这件事的处理。写成代码大概是下面这个样子:

//人

public class Man
{

  //人的事件(这里用了执行无参数无返回值方法的委托类型)
  public event Action Fire;

  //封装了事件的类方法

  public void Action()
  {
    if (Fire != null)
    {
      Console.WriteLine("人开枪了");
      //触发事件

      Fire();
    }
  }  
}

//鸟

public class Bird
{
  public string birdName { get; set; }

  //声明一个集合类型的静态字段,用于保存实例化的所有Bird类

  public static List<Bird> Birds = new List<Bird>();

  //这是鸟类对于开枪的事件处理器

  internal static void Fly()
  {
    for (int i = 0; i < Birds.Count; i++)
    {
      Console.WriteLine(Birds[i].birdName + "飞走了");
    }
  }

  //每一次实例化都会在构造函数中保存当前实例化的Bird类

  public Bird()
  {
    Birds.Add(this);
  }
}

class Program
{
  static void Main(string[] args)
  {

    //实例化对象
    Man man = new Man();

    //订阅事件,联结两类对象中的事件和事件处理器
    man.Fire += Bird.Fly;

    //循环生成Bird类
    for (int i = 0; i < 5; i++)
    {
      Bird bird = new Bird();
      bird.birdName = "小鸟" + i;
    }

    //调用封装事件的方法,触发事件
    man.Action();
  }

}

  

C# event 事件的更多相关文章

  1. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  2. Event事件

    妙味课堂-Event事件 1.焦点:当一个元素有焦点的时候,那么他就可以接受用户的输入(不是所有元素都能接受焦点) 给元素设置焦点的方式: 1.点击 2.tab 3.js 2.(例子:输入框提示文字) ...

  3. JS学习笔记9之event事件及其他事件

    -->鼠标事件-->event事件对象-->默认事件-->键盘事件(keyCode)-->拖拽效果 一.鼠标事件 onclick ---------------鼠标点击事 ...

  4. JS(event事件)

    常用的event事件: 属性 此事件发生在何时... onabort 图像的加载被中断. onblur 元素失去焦点. onchange 域的内容被改变. onclick 当用户点击某个对象时调用的事 ...

  5. event事件学习小节

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Javascript 事件对象(二)event事件

    Event事件: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...

  7. js event 事件兼容浏览器 ie不需要 event参数 firefox 需要

    js event 事件兼容浏览器    ie不需要 event参数   firefox 需要 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  8. PHP event 事件机制

    PHP event 事件机制   <?php /* * PHP 事件机制 */ class baseClass{ private $_e; public function __set($name ...

  9. trigger()的event事件对象之坑

    问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...

  10. Event事件详解

    首先提到event,先要明白event的产生,也要先明白焦点,什么是焦点.焦点 : 使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入. 我们可以通过一些方式给元素设置 ...

随机推荐

  1. Launch configuration JUnitCore references non-existing project XXX.

  2. @loj - 2174@ 「FJOI2016」神秘数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...

  3. AspNetPager 样式

    使用方法: 1.引入样式表. 将 想要使用的样式表加入到本页面<style type="text/css"></style>标记中,或者新建一个css文件如 ...

  4. react 问题记录

    1.控制台报错: Uncaught Error: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be add ...

  5. Android ListView显示底部的分割线

    有些时候,我们会提出这样的需求,希望ListView显示底部(顶部)的分割线,这样做,会使得UI效果更加精致,如下图所示: 如果搜索资料,大家会搜到一堆相关的方法,最多的莫过于设置listview的f ...

  6. H3C TCP连接的建立

  7. H3C 无线覆盖原则-蜂窝式覆盖

  8. 父元素高度不确定,子元素左右等高的div布局

    上一篇介绍了实现几个div并排居中点这里,但是指定了高度,这篇文字主要说一下父元素高度不确定,子元素左或右高度不确定且高度相同布局div盒子 三个div盒子如下 <div class=" ...

  9. H3C DCC的特点

  10. 如何在SpringMVC项目中部署WebService服务并打包生成客户端

    场景 某SpringMVC项目原本为一个HTTP的WEB服务项目,之后想在该项目中添加WebService支持,使该项目同时提供HTTP服务和WebService服务.其中WebService服务通过 ...