事件第二篇: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. WPF中的简单水动画

    原文 https://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/ 很多年前(80年代中期),我在一家拥有Silicon Grap ...

  2. Celery后台任务

    Celery 在程序运行过程中,经常会遇到一些耗时耗资源的任务,为了避免这些任务阻塞主进程的运行,我们会采用多线程或异步任务去处理.比如在Web中需要对新注册的用户发一封激活邮件来验证账户,而发邮件本 ...

  3. linux centos 一键安装环境

    phpStudy for Linux 支持Apache/Nginx/Tengine/Lighttpd, 支持php5.2/5.3/5.4/5.5切换 已经在centos-6.5,debian-7.4. ...

  4. 无旋treap hfq-treap

    怎么代码都这么长... #include<iostream> #include<stdio.h> #include<string.h> #include<al ...

  5. @noi.ac - 489@ shuffle

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个长度为 n 的序列 s1,s2,-,sn,它有 2^n− ...

  6. vue项目配置同一局域网可使用ip访问

    1.检查 package.json文件,scripts.dev设置 host改成 "0.0.0.0" 2.config文件中找到 index.js 文件的host改成 " ...

  7. ubuntu环境变量的三种设置方法

    一:设置环境变量的三种方法 1.1 临时设置 export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH 1.2 当前用户的全局设置 打开~/. ...

  8. oracle CBO下使用更具选择性的索引

    基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率. 如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少 ...

  9. 使用模块定义AngularJS组件

    一.模块创建/查找 module 当创建一个模块时,必须指定name和requires参数,即使你的模块并不存在依赖 var myApp=angular.module("exampleApp ...

  10. 智课雅思词汇---九、mon是什么意思

    智课雅思词汇---九.mon是什么意思 一.总结 一句话总结:词根:mon(min) = to warn, to advise, to remind 1.mit是什么意思? 词根:-mitt-, -m ...