C#学习笔记-事件
来源:互联网 发布:seo具体怎么做 编辑:程序博客网 时间:2024/04/27 15:35
事件
事件基于委托,为委托提供了一种发布/订阅机制,触发事件的类叫做发布者,而关心该事件有没有发生,并等候通知的类叫订阅者,而在中间又可以定义一个订阅系统,用来集中处理订阅者对事件的订阅和取消。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EventPractice{ //订阅者关心的信息,在信息类的名称后面加上EventArgs,并继承自EventArgs是.net的编码规范 class FoodEventArgs:EventArgs { //使用readonly可以使字段在初始化时赋值而在后面使用时不可更改 public readonly string num; public readonly string kind; public FoodEventArgs(string num,string kind) { this.num = num; this.kind = kind; } } //搞事的人 class XiaoXie { //事件基于委托,要使用事件就得先声明一个委托 //这里同样有一个编码规范,即在委托的名称后面跟上EventHandler,事件的名称则不要这个EventHandler public delegate void BuyEventHandler(object sender, FoodEventArgs e); //事件的关键词event,后面跟上一个委托 public event BuyEventHandler Buy; //将触发事件的方法定义为protected,只允许其派生类继承和重写, //体现了事件的特性,即事件只能由服务代码自己触发,订阅者只能订阅,不能修改 protected virtual void BuyFoodTrigger(FoodEventArgs e) { if (Buy!=null) { //触发事件,将发布者,也就是自身所在类型作为第一个参数, //传递给订阅者,作为订阅者所监看的对象 Buy(this, e); } } //传入要买的食品相关信息,交给触发方法触发事件 public void BuyFood(FoodEventArgs e) { BuyFoodTrigger(e); } } //订阅者小李,它包含一个或多个与发布者委托类型相同的方法 class XiaoLi { public static void Food(object sender,FoodEventArgs e) { Console.WriteLine("骚年,你要的{0}个{1}买回来了", e.num, e.kind); } } //订阅者小龙 class XiaoLong { public static void Food(object sender,FoodEventArgs e) { Console.WriteLine("傻屌,你要的{0}个{1}买回来了", e.num, e.kind); } } //订阅系统,在这个系统中,订阅者将订阅发布者的事件 //也就是小谢把东西买回来后,就能通知小李和小龙 class Notice { public Notice() { } //传入Notice的两个主体,通知人小谢和食品信息 public Notice (XiaoXie xiaoxie,FoodEventArgs e) { //订阅者订阅发布者的事件,但要注意订阅的方式是 事件 += 订阅者,也就是把 //订阅者添加进事件中,等事件一触发,订阅者就能收到消息 if (e.kind=="香辣藕片") { xiaoxie.Buy += XiaoLi.Food; } if (e.kind== "狼牙土豆") { xiaoxie.Buy+= XiaoLong.Food; } //小谢买回食品,触发事件 xiaoxie.BuyFood(e); } } class Client { static void Main(string[] args) { //先定义食品的信息 FoodEventArgs theFoodOfXiaoLi = new FoodEventArgs("5", "香辣藕片"); FoodEventArgs theFoodOfXiaoLong = new FoodEventArgs("3", "狼牙土豆"); //实例化小谢 XiaoXie xiaoxie = new XiaoXie(); //然后启动订阅系统,小谢买到了谁的食品,就会通知谁 Notice notice = new Notice(xiaoxie, theFoodOfXiaoLong); Console.ReadKey(); } }}
在结果中可以看到,小谢只买了小龙的食品,所以只对订阅者小龙发了通知
委托和事件的区别:
委托是对方法的引用,可以在任何地方直接调用委托即可完成对方法的调用,而事件则有一个发布事件的主体,时间只能在出了事的事件发布者中触发,不能在其他地方调用,事件相当于出版社出了新书,发短信通知你可以来买书啦,这个事件是只发生在出版社当中的,是出了书才能触发的,而委托则是任何人都知道你的手机号,都可以通知你来买书,但他到底出没出书呢,只有他自己知道。
可以说,事件本质就是委托,事件是对委托的一种包装,是委托的一个实例,他使委托的使用范围缩小,专用性和安全性提高。
0 0
- C#学习笔记 事件
- C#学习笔记-事件
- C#学习笔记(事件)
- C#事件 委托 学习笔记
- C#学习笔记(7)事件
- C#学习笔记 自定义事件
- C#学习笔记----事件 自定义事件
- C#学习笔记(十一):事件基础
- C#学习笔记(十二):事件进阶
- C#中实现事件的学习笔记
- C#学习笔记之二:事件
- C#委托与事件学习笔记
- c# 委托与事件 学习笔记
- C#学习笔记19-委托和事件
- 【unity3d-C#学习笔记】C#中的委托和事件
- C#学习笔记(三)—–C#高级特性中的委托与事件:关于事件
- C#教学第9讲事件1(学习笔记)
- C#教学第10讲事件2(学习笔记)
- linux wget 命令用法详解(附实例说明)
- 如何在Eclipse中查看Java类库的源代码
- 音乐id3信息解析
- mysql 操作记录
- Longest Palindrome
- C#学习笔记-事件
- excel函数应用练习---判断字符串长度,去掉字符串里的空格,全角句号替换为小数点
- Ghost的使用方法
- window的版本宏
- UGUI的xlua例子
- 【资源列表】安装软件列表
- 使用运行时机制向Category中添加属性
- 【死磕Java并发】-----Java内存模型之happens-before
- Majority Element