C#中的委托、事件及事件的订阅
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; //P80
//事件建立在委托之上,通过该机制,某个类在发生某些特定的事情之后,通知其他类或对象正在发生的事情。 //1.定义价格事件的参数类--PriceChangedEventArgs;
//2.然后,定义该时间段额处理委托类型----PriceChangedEventHander;
//3.在Shop类中定义具体的事件----PiceChanged,它实际上就是PriceChangedEventHander类型的委托;
//4.在OnPriceChanged()中引发PriceChanged事件,将当前类作为事件的发生者,在引发事件之前先判断是否已经注册。
//--------------------------------------------------------------------------------------------------------- namespace Uing_event
{
class Program
{
//①定义价格事件的参数类--PriceChangedEventArgs
public class PriceChangedEventArgs : EventArgs
{
//构造函数
public PriceChangedEventArgs(string nm, float pr)
{
this._Name = nm;
this._Price = pr;
}
//价格变化的商品名称
private string _Name;
public string Name
{
get
{
return this._Name;
}
set
{
this._Name = value;
}
}
//价格变化之后的商品价格
private float _Price;
public float Price
{
get
{
return this._Price;
}
}
} //②定义价格变化的委托类型
public delegate void PriceChangedEventHandle(object sender,PriceChangedEventArgs e);//定义事件处理的委托类型 △ //商店类,价格变化事件的发生类
//-------------------------------------------------------------------------------------------------------
public class Shop
{
//③通过event关键字定义价格变化事件
public event PriceChangedEventHandle PriceChanged;//它实际上就是PriceChangedEventHander类型的委托 //引发事件函数
protected void OnPriceChanged(PriceChangedEventArgs arg)//在该函数中直接引发PriceChanged事件
{
//如果事件已经注册,则通过委托调用函数的方式通知事件订阅用户
if (this.PriceChanged!=null)//weng:如果事件被订阅
{
this.PriceChanged(this,arg);
}
} //更新商品名称,并引发商品价格变化事件
public void UpdatePrice(string nm, float newPrice)
{
//创建PriceChanged事件参数
PriceChangedEventArgs arg = new PriceChangedEventArgs(nm, newPrice);
//引发PriceChanged事件
this.OnPriceChanged(arg);
}
public Shop(string nm)
{
this._Name = nm;
}
//商品名称
private string _Name;
public string Name
{
get { return this._Name; }
}
}//end class Shop //客户类,用于订阅PriceChanged事件
//-------------------------------------------------------------------------------------------------------
public class Customer
{
public Customer(string nm)
{
this._Name = nm;
}
//顾客姓名
private string _Name;
public string Name
{
get { return this._Name; }
}
//PriceChanged事件的响应函数
public void Shop_PriceChanged(object sender, PriceChangedEventArgs e)
{
//将sender转换为Shop类型变量,并打印提示信息
Shop sp = sender as Shop;
if (sp != null)
System.Console.WriteLine("{0}收到{1}:{2}新的价格为{3}元",this._Name,sp.Name,e.Name,e.Price);
}
} static void Main(string[] args)
{
//定义两个Shop对象,用于引发事件
Shop shop1 = new Shop("南京和平电影城");
Shop shop2 = new Shop("钱塘园");
//定义两个Customer对象,用来订阅并处理事件
Customer cust1 = new Customer("WENG LIU");
Customer cust2 = new Customer("Customer1"); //cust1订阅Shop1的PriceChanged事件,并使用自己的处理函数Shop_PriceChanged处理该事件。
//顾客订阅哪家店铺的事件,实际上就是将本人对该商店的那个事件的处理函数加入那家商店的委托类型变量函数链中
System.Console.WriteLine("1.shop1.UpdataPrice(\"Goods1\",2.2f)");
shop1.PriceChanged += cust1.Shop_PriceChanged;
//shop1更新商品价格,引发PriceChanged事件
shop1.UpdatePrice("Goods1",2.5f); //cust2订阅Shop2的PriceChanged事件,并使用自己的处理函数Shop_PriceChanged处理该事件。
System.Console.WriteLine("2.shop2.UpdataPrice(\"Goods2\",5.6f)");
shop2.PriceChanged += cust2.Shop_PriceChanged;
//shop1更新商品价格,引发PriceChanged事件
shop2.UpdatePrice("Goods2", 5.6f); //cust2订阅shop1的shop1的PriceChanged事件
shop1.PriceChanged += cust2.Shop_PriceChanged;
//shop1更新商品价格,引发PriceChanged事件
System.Console.WriteLine("3.shop1.UpdataPrice(\"Goods3\",1.6f)");
shop1.UpdatePrice("Goods3",1.6f); //csut1取消订阅shop1的PriceChanged事件
shop1.PriceChanged -= cust1.Shop_PriceChanged;
//shop1更新商品价格,引发PriceChanged事件
System.Console.WriteLine("4.shop1.UpdataPrice(\"Goods4\",0.5f)");
shop1.UpdatePrice("Goods4", 1.6f); }
}
}
C#中的委托、事件及事件的订阅的更多相关文章
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- (转)C#中的委托(Delegate)和事件(Event)
转自:http://blog.chinaunix.net/uid-576762-id-2733751.html 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...
- 深刻理解:C#中的委托、事件
C#中的事件还真是有点绕啊,以前用JavaScript的我,理解起来还真是废了好大劲!刚开始还真有点想不明白为什么这么绕,想想和JS的区别,最后终于恍然大悟! C#中事件绕的根本原因: C#的方法,它 ...
- 分分钟用上C#中的委托和事件之窗体篇
上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...
- C#中的委托和事件(续)
转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...
- .NET之美——C#中的委托和事件(续)
C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...
- C#中的委托和事件2-2(转)
引言 如果你看过了 C#中的委托和事件2-1 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些 ...
- 转:C#中的委托和事件(续)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...
随机推荐
- gradle/gradle plugin/Android studio关系
gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...
- Oracle 03113
SYSTEM的只有2M可以用了,还是需要 扩增 SYSTEM和SYSAUX的表空间 SELECT a.tablespace_name,a.bytes/1024/1024 total_M,b.bytes ...
- jQuery的zTree插件
写在前面 jQuery的 zTree插件 关键代码 <%@ page language="java" contentType="text/html; charset ...
- spring boot允许跨域(CORS)的配置
添加@Configuration配置类即可. @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { ...
- 运维笔记--线上服务器git环境配置
场景描述: 我们采用git去管理代码分支,本地开发环境,线上服务器多数情况下也会使用git去管理程序代码,那么新的一台服务器,如果指定了目标路径作为代码存放路径,该如何配置git环境, 以达到跟远程服 ...
- 运维笔记--Docker环境ubuntu系统安装指定版本python[3.6]
场景描述: 直接安装出现如下异常: root@ae2d02e458f3:/home# apt-get install python3.6 Reading package lists... Done B ...
- Celery 服务搭建
整个项目工程如下 __init__.py """ 注意点:python3.7 需要执行 pip install --upgrade https://github.com/ ...
- C# selenium 高级
https://www.cnblogs.com/morang/p/7441091.html https://www.cnblogs.com/tobecrazy/p/4817946.html https ...
- Bladex之Arhcer代码生成器
代码生成器配置: 数据库表准备:Archer中增加对应的表:(参照test_notice和test_notice_list表)主表:SET FOREIGN_KEY_CHECKS=0; -- ----- ...
- CMDBuild部署教程
一.CMDBuild简介 CMDBuild是一个通过Web界面配置的CMDB系统.可以通过Web界面来进行建模.创建资产数据库,并处理相关的工作流程.CMDBuild可用于集中管理数据库模块和外部应用 ...