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#中的委托、事件及事件的订阅的更多相关文章

  1. C#中的委托(Delegate)和事件(Event)

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  2. (转)C#中的委托(Delegate)和事件(Event)

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  3. 深刻理解:C#中的委托、事件

    C#中的事件还真是有点绕啊,以前用JavaScript的我,理解起来还真是废了好大劲!刚开始还真有点想不明白为什么这么绕,想想和JS的区别,最后终于恍然大悟! C#中事件绕的根本原因: C#的方法,它 ...

  4. 分分钟用上C#中的委托和事件之窗体篇

    上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...

  5. 《C#高级编程》学习笔记------C#中的委托和事件(续)

    本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...

  6. C#中的委托和事件(续)

    转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...

  7. .NET之美——C#中的委托和事件(续)

    C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...

  8. C#中的委托和事件2-2(转)

    引言 如果你看过了 C#中的委托和事件2-1 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些 ...

  9. 转:C#中的委托和事件(续)

    引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...

随机推荐

  1. 微信小程序获取当前地理位置

    获取用户地理位置,需要用到以下三个api方法:   wx.getSetting() : 获取用户的授权列表信息 wx.openSetting():调起客户端小程序设置界面 wx.getLocation ...

  2. HTML5快速写页面的方法

    1 如果有原型的HTML页面(Axure导出来),可以在此从F12的“查看器”基础上拷贝到一个新文件,继续写代码. 2 利用EditPlus软件的工具 3 使用Dreamweaver CS5,可以直观 ...

  3. Kibana数据可视化

    Kibana数据可视化 1,3.1使用logstash导入数据的问题 会出现错误提示: [location] is defined as an object in mapping [doc] but ...

  4. Oracle JDBC prefetch: how to avoid running out of RAM

    Using Oracle java JDBC (ojdbc6 11.2.0.4), loading a query with many rows takes forever (high latency ...

  5. Oracle系列十三 视图

    视图 :从表中抽出的逻辑上相关的数据集合. 视图是一种虚表. 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表. 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 ...

  6. [整理]如何撤销远程的git提交?

    确保你在你想要撤销的分支上. 第一步,本地使用 get reset --hard ,切换到特定的commit. 第二部,使用 --force推送到远程分支. git reset --hard cedc ...

  7. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器开放平台利用 webpack 打包压缩后端代码

    需求背景 javaScript的用途是解决页面交互和数据交互,最终目的是丰富客户端效果以及数据的有效传递. 并且具有良好的用户体验. javaScript可以快速实现页面交互,即js操作html的do ...

  8. istio1.0安装

    1. istio1.0安装 创建 istio 目录 [root@centos-110 ~]# mkdir istio [root@centos-110 ~]# cd istio 1.1 获取安装包 链 ...

  9. TCP/IP和OSI4层、7层协议介绍

    1.TCP/IP全称:Transmission Control Protocol / Internet Protocol 中文翻译:传输控制协议 / 互联网协议 2.OSI4层.7层模型:

  10. SonarQube - 安装与运行SonarQube

    1 - 下载SonarQube SonarQube有多个版本,其中CE(Community Edition)版本免费开源,其余的开发者版本.企业版本和数据中心版本都是收费版本. 官网下载:https: ...