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. 用Python自动办公,做职场高手(完结)

    教程目录: ┣━07.S2 Word自动化处理,又快又好做文档┃  ┣━36 本章介绍┣━08.[Word]S2-1 轻松用Python快速生成Word文档┃  ┣━45.[真实案例]S2-1-3 批 ...

  2. SpringBoot(十六):SpringBoot2.1.1集成fastjson,并使用fastjson替代默认的MappingJackson

    springboot2.1.1默认采用的json converter是MappingJackson,通过调试springboot项目中代码可以确定这点.在springboot项目中定义WebMvcCo ...

  3. RocketMQ常用命令【转】

    首先进入 RocketMQ 工程,进入/RocketMQ/bin   在该目录下有个 mqadmin 脚本 . 查看帮助:   在 mqadmin 下可以查看有哪些命令 a: 查看具体命令的使用 :  ...

  4. mac node配置path

    一.查看node安装路径 whitch node 二.打开配置文件 vi ./.bash_profile 三.添加一行PATH(按i进入insert才能编辑) export NODE_HOME=&qu ...

  5. Docker使用 - 镜像

    获取镜像 命令:docker  pull  [选项]  镜像名 可通过 ”docker  pull  --help“  命令来查看有哪些选项 docker pull training/webapp # ...

  6. ABAP基础篇1 内表

    内表类型 abap 内表类型有三种: 标准表(一般ABAP程序中用的最多就是这种表) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码.表的键值不唯一,且没有按照表键自动 ...

  7. python 根据生日计算年龄 sqlalchemy根据身份证号计算生日 性别

    import datetime '): birth_d = datetime.datetime.strptime(birth_s, "%Y%m%d") today_d = date ...

  8. WPF--控件模板的视觉效果呈现流程及逻辑

    外部通过属性把数据--传递给-->(破拆后)内部可视化树 ----> 内部可视化树呈现出视觉效果 ----> 各种内部可视化组件的视觉效果组合  --- 呈现 -->  外部的 ...

  9. CSS继承控制:inherit、initial和unset

    CSS里有三种常用的属性值继承方式:inherit,initial和unset.我们用一个简单的例子来演示一下: <ul style="color: green;"> ...

  10. kubernetes reference

    hyperkube在kubernetes pod里面执行kubernetes命令(例如kubectl) https://feisky.gitbooks.io/kubernetes/components ...