C#事件(event)的一个实例

这个实例来自我们C#老师,是一个虽然简单但是很全面的例子,代码如下:

//做事件程序的一般流程: //1.定义事件参数类。 //2.定义委托类型。 //1和2一般定义为全局。

//3.声明事件。 //3.必须在发布者中声明

//4.定义事件的订阅者类。 //一般是全局的。并且尽可能考虑通用性。 //即尽可能适用于多个事件

//5.定义 响应 事件的函数。 On开头的函数。 //6.定义 调用 事件函数的 业务逻辑。 //5和6必须在发布者中实现。

//7.在上层逻辑中,组装 上述的类。

//订阅者 ,发布者。 //发布者:发布信息。所以必须提供一种机制让订阅者订阅。 //事件机制。

//发布的内容:事件参数类 以及 发布者本身。

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate
{
  public class Heater
  {
    private int temperature;
    public string type = "RealFire 001";        // 添加型号作为演示
    public string area = "China Xian";          // 添加产地作为演示



    public class BoliedEventArgs : EventArgs    /*定义事件参数类*/
    {
      public readonly int temperature;
      public BoliedEventArgs(int temperature) {
        this.temperature = temperature;
      }
    }

    public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e);  //声明委托
    public event BoiledEventHandler Boiled; //声明事件

    protected virtual void OnBolied(BoliedEventArgs e) {
      if(Boiled != null) {  //如果有对象注册
        Boiled(this, e);        //调用所有注册对象的方法
      }
    }

    public void BoilWater() {
      for(int i = 0;i <= 100;i++) {
        temperature = i;
        if(temperature > 95) {
          BoliedEventArgs e = new BoliedEventArgs(temperature);
          OnBolied(e);  //触发事件。
          //被触发的事件一般是On开头,后面加事件名称。
        }
      }
    }
  }

  public class Alarm
  {
    public void MakeAlert(Object sender, Heater.BoliedEventArgs e) {
      Heater heater = (Heater)sender;
      Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
      Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:\n", e.temperature);
    }
  }

  public class Display
  {
    public static void ShowMsg(Object sender, Heater.BoliedEventArgs e) {   //静态方法
      Heater heater = (Heater)sender;
      Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
      Console.WriteLine("Display:水快烧开了,当前温度:{0}度。\n", e.temperature);
    }
  }

  class Program
  {
    static void Main1() {
      Heater heater = new Heater();
      Alarm alarm = new Alarm();

      heater.Boiled += alarm.MakeAlert;           //注册方法
      heater.Boiled += (new Alarm()).MakeAlert;     //给匿名对象注册方法
      heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);  //也可以这么注册
      heater.Boiled += Display.ShowMsg;             //注册静态方法

      heater.BoilWater();
    }
  }
}


//做事件程序的一般流程:
//1.定义事件参数类。
//2.定义委托类型。
//1和2一般定义为全局。

//3.声明事件。
//3.必须在发布者中声明

//4.定义事件的订阅者类。
//一般是全局的。并且尽可能考虑通用性。
//即尽可能适用于多个事件

//5.定义 响应 事件的函数。 On开头的函数。
//6.定义 调用 事件函数的 业务逻辑。
//5和6必须在发布者中实现。

//7.在上层逻辑中,组装 上述的类。

//订阅者 ,发布者。
//发布者:发布信息。所以必须提供一种机制让订阅者订阅。
//事件机制。

//发布的内容:事件参数类 以及 发布者本身。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互...

30850
来自专栏大内老A

从Trace和Debug来看条件编译(Conditional Compilation)

条件编译,顾名思义,就是根据在编译时指定的条件决定最后需要编译的代码。条件编译是我们可以针对某些特性的环境编写相应的代码,比如有写的代码只需要在Debug模式下...

234100
来自专栏逸鹏说道

分享一个自制的 .net线程池2

/// <summary> /// 该方法必须在 locked 下执行 /// </summary> ...

25050
来自专栏JavaQ

自定义注解设置缓存有效期的正确姿势

引言 redis缓存的有效期可以通过xml配置文件设置(默认有效期),也可以通过编码的方式手动去设置,但是这两种方式都存在缺陷。xml方式设置的是全局的默认有效...

42770
来自专栏王磊的博客

Thread线程的深刻理解和代理方法参数[有图有真相]

在这说的是Thread的基本用法,线程池ThreadPool在这就不说的,以前的blog有写,基本上两个用法都是相同的。基本用法和图,不需要的大鸟请绕行,谢谢!...

36280
来自专栏Java技术交流群809340374

Dubbo服务消费者调用过程

首先通过ReferenceConfig类的private void init()方法会先检查初始化所有的配置信息后,调用private T createProx...

44510
来自专栏恰童鞋骚年

NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

  首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库。目前最流行的就是S...

8010
来自专栏叔叔的博客

Java调用Groovy

12830
来自专栏大内老A

Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本

Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)...

35450
来自专栏逍遥剑客的游戏开发

Nebula3学习笔记(8): 脚本系统

14440

扫码关注云+社区

领取腾讯云代金券