C#自定义事件的案例

ops/2024/10/29 22:05:23/

方法一,详细的声明

namespace HelloWorldConsole
{internal class Program{static void Main(string[] args){Customer customer = new Customer();Waiter waiter = new Waiter();customer.Order += waiter.Action;customer.Action();}}public class OrderEventArgs : EventArgs{public string DishName { get; set; }public string Size { get; set; }}public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);public class Customer{public double Bill { get; set; }private OrderEventHandler orderEventHandler;public event OrderEventHandler Order{add { orderEventHandler += value; }remove { orderEventHandler -= value; }}public void PayTheBill(){Console.WriteLine("i will pay-{0}", Bill);}public void Think(){if (orderEventHandler != null){OrderEventArgs e = new OrderEventArgs();e.DishName = "宫保鸡丁";e.Size = "large";orderEventHandler(this, e);}}public void Action(){Think();PayTheBill();}}public class Waiter{public void Action(Customer customer, OrderEventArgs e){double price = 10;switch (e.Size){case "small": price /= 2; break;case "large": price *= 1.5; break;default: break;}Console.WriteLine("i will serve the dish {0}-{1}", e.DishName, e.Size);customer.Bill += price;}}
}

方法二,简化的声明,也是最常用的写法

namespace HelloWorldConsole
{internal class Program{static void Main(string[] args){Customer customer = new Customer();Waiter waiter = new Waiter();customer.Order += waiter.Action;customer.Action();}}/// <summary>/// 事件参收/// </summary>public class OrderEventArgs : EventArgs{public string DishName { get; set; }public string Size { get; set; }}public class Customer{public double Bill { get; set; }public event EventHandler Order;public void Think(){if (Order != null){OrderEventArgs e = new OrderEventArgs();e.DishName = "宫保鸡丁";e.Size = "large";Order(this, e);}}public void PayTheBill(){Console.WriteLine("i will pay-{0}", Bill);}public void Action(){Think();PayTheBill();}}public class Waiter{public void Action(object sender, EventArgs _e){Customer customer = sender as Customer;OrderEventArgs e = _e as OrderEventArgs;double price = 10;switch (e.Size){case "small": price /= 2; break;case "large": price *= 1.5; break;default: break;}Console.WriteLine("i will serve the dish {0}-{1}", e.DishName, e.Size);customer.Bill += price;}}
}


http://www.ppmy.cn/ops/129415.html

相关文章

用Rust从头写CAD】第一章 Rust基础 第二节 第一个Rust程序

文章目录 [TOC](文章目录) 1、新建名称为“cad”的项目2、编辑器打开名称为“cad”的项目3、使用编辑器4、运行程序 Rust自带管理工具cargo&#xff0c;它让我们新建项目更加便捷。 1、新建名称为“cad”的项目 请在文件夹中选择项目的主目录 如上图&#xff0c;我选的路径是…

设计模式(一)

设计模式&#xff08;一&#xff09; 特点&#xff1a;可复用的面向对象软件 底层思维 设计者 抽象思维语言构造 面向对象 编译转换 组件封装 内存模型 设计模式 运行状态 架构模式封装&#xff1a;隐藏…

2024年网络安全(黑客)自学总结

前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 如何成为一名黑客 很多朋友在学习安全方面都会半路转行&#xff0c…

docker 安装 PostgreSQL

参考链接 https://hub.docker.com/_/postgres 安装 # 后台运行&#xff0c;镜像名称为 postgres # --name postgres 容器名称为 postgres # POSTGRES_PASSWORD 超级用户的密码&#xff0c;超级用户名默认为&#xff1a;postgres&#xff0c;可以使用 POSTGRES_USER 环境变量设…

解决nanobind库中C++与Python的多参数绑定不兼容

最近在实验室写一个开源项目的扩展&#xff0c;用到了nanobind库来绑定多参数的C模板&#xff0c;遇到了匪夷所思的问题 问题描述 #1 0x00007ffff73b881c in _Py_XINCREF (op0x7ffff74187830100)at /usr/include/python3.8/object.h:532 #2 0x00007ffff73ba94e in nanobind:…

【测试平台】Odin-ws 工程环境部署

背景&#xff1a; 这个是我4年半以前接受测试平台过程中遇到问题记录&#xff0c;因为交接成都这边&#xff0c;拿出来直接用了。这里做个记录。 一、美东测试服务器相关 1.主服务器部署机器 该机器是美东服务器。 机器配置&#xff1a;t5.xlarge cpu 4核&#xff0c; 内存…

用Python在Excel工作表中添加、修改及删除超链接

在创建Excel工作簿时&#xff0c;内部文档的互链、报告自动化生成或是创建外部资源快速访问路径是比较常见的需求。通过超链接&#xff0c;我们可以将工作表与外部资源、文件或网页无缝连接&#xff0c;提升数据的交互性和可读性。无论是为了快速导航、动态更新内容&#xff0c…

全国各省、市、县(区)PM2.5浓度面板数据1980至2022年-最新出炉_附下载链接

1980-2022年全国各省、市、县&#xff08;区&#xff09;PM2.5浓度面板数据 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;1980-2022年全国各省、市、县&#xff08;区&#xff09;PM2.5浓度面板数据-最新出炉.zip 资源介绍 一、数据来源 该数据集由NA…