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
原创粉丝点击