当前位置: 首页 > news >正文

C#练习——事件

一、任务:利用事件完成热水器温度监控系统设计与实现

实现目标:有一个热水器,包含一个加热器,一个报警器,一个显示器

(1)当水温超过95度时,报警器会开始发出语音,告诉你水的温度

(2)显示器也会改变水温提示,提示水已经烧开了


二、核心架构设计

1. 事件中心 - Heater类(事件发布者)

class Heater
{public event Action<int> myEvnet;  // 关键事件:温度变化事件private int value = 0;              // 当前水温public void AddHot(){int updateIndex = 0;while (true){if(updateIndex % 9999999 == 0)  // 模拟时间间隔{++value;Console.WriteLine("加热到{0}度", value);// 温度达到100度停止加热(测试用)if( value >= 100 ) break;// 温度超过95度触发事件if(value >= 95){if( myEvnet != null ){myEvnet(value);  // 触发事件,传递当前温度}// 清空事件订阅(只提示一次)myEvnet = null;}updateIndex = 0;}++updateIndex;}}
}
  • 使用Action<int>泛型事件,传递当前温度值

  • 空值检查避免空引用异常

  • 事件触发后清空订阅,实现"只提示一次"的逻辑

2. 事件订阅者 - 两个监控系统

Alarm类(报警器)
class Alarm
{public void ShowInfo(int v){Console.WriteLine("当前水温{0}度", v);  // 实时报警}
}
Display类(显示器)
class Display
{public void ShowInfo(int v){Console.WriteLine("水开了,当前水温{0}度", v);  // 状态显示}
}

三、事件机制深度解析

事件订阅流程

// 主程序中的订阅过程
h.myEvnet += a.ShowInfo;  // 报警器订阅
h.myEvnet += d.ShowInfo;  // 显示器订阅

事件触发条件

if(value >= 95)  // 温度阈值判断
{myEvnet(value);  // 触发所有订阅的方法myEvnet = null;  // 清空订阅(一次性通知)
}

四、完整代码

using System;namespace Lesson13_练习题
{class Heater{public event Action<int> myEvnet;private int value = 0;public void AddHot(){int updateIndex = 0;while (true){if(updateIndex % 9999999 == 0){++value;Console.WriteLine("加热到{0}度", value);//为了不频繁打印 超过100度 直接 不加热 测试用if( value >= 100 ){break;}//温度超过95度 就触发 报警器和显示器显示信息if(value >= 95){if( myEvnet != null ){myEvnet(value);}//如果只想提示一次 这清空事件容器即可myEvnet = null;}//隔一段时间 加一点温度updateIndex = 0;}++updateIndex;}}}class Alarm{public void ShowInfo(int v){Console.WriteLine("当前水温{0}度", v);}}class Display{public void ShowInfo(int v){Console.WriteLine("水开了,当前水温{0}度", v);}}#endregionclass Program{static void Main(string[] args){Console.WriteLine("事件练习题");Heater h = new Heater();Alarm a = new Alarm();Display d = new Display();h.myEvnet += a.ShowInfo;h.myEvnet += d.ShowInfo;//加热h.AddHot();}}
}
http://www.dtcms.com/a/398270.html

相关文章:

  • 深拷贝浅拷贝的区别?如何实现⼀个深拷贝?
  • C primer plus (第六版)第十一章 编程练习第10题
  • AgentScope Studio 安装与测试
  • 长沙房产交易中心官网做seo网站空间
  • 金融培训网站源码淘宝基地网站怎么做
  • Spark核心Storage详解
  • 高系分二十:微服务系统分析与设计
  • 深度学习----ResNet(残差网络)-彻底改变深度神经网络的训练方式:通过残差学习来解决深层网络退化问题(附PyTorch实现)
  • 脑电模型实战系列:入门脑电情绪识别-用最简单的DNN模型起步
  • 赣州企业网站建设比较火的推广软件
  • 广州公司网站制作网页游戏排行榜20
  • 算法提升之单调数据结构-(单调队列)
  • PHP 线上环境 Composer 依赖包更新部署指南-简易版
  • 设计模式-原型模式详解
  • ESP8266与CEM5826-M11毫米波雷达传感器的动态检测系统
  • [原创]怎么用qq邮箱订阅arxiv.org?
  • 设计模式-中介者模式详解
  • 【探寻C++之旅】第十四章:简单实现set和map
  • 牛客:机器翻译
  • 20250925的学习笔记
  • 域名不同网站程序相同wordpress多门户网站
  • 淘宝API商品详情接口全解析:从基础数据到深度挖掘
  • 【低代码】百度开源amis
  • 求推荐专业的网站建设开发免费商城
  • java面试day4 | 微服务、Spring Cloud、注册中心、负载均衡、CAP、BASE、分布式接口幂等性、xxl-job
  • 高QE sCMOS相机在SIM超分辨显微成像中的应用
  • C++设计模式之创建型模式:原型模式(Prototype)
  • Node.js/Python 调用 1688 API 实时拉取商品信息的实现方案
  • OpenLayers地图交互 -- 章节九:拖拽框交互详解
  • 浅谈 Kubernetes 微服务部署架构