事件概念
事件的本质其实也是委托,只不过加了event关键字
语法:
public event 委托名 事件名
注意: 定义事件时,一般要有一个委托类型,用这个委托类型来定义处理事件的方法类型。注:笔者会在本文中提供两个思路
事件--委托和事件有什么联系和区别?
事件是委托的实例--事件是特殊的委托;
都可以+=/-=;
既然有了多播委托,为什么又搞个事件呢?
a.安全--事件是只能在类的内部执行;
b.就算是类的子类也不能执行当前类中的事件,只能由自己来执行;
c.事件从外面操作,只能有一个+=/-=;
为什么要用事件?事件究竟能干什么?
事件(观察者模式)能把固定动作和可变动作分开,完成固定动作,把可变动作分离出去,由外部控制
搭建框架时,恰好就需要这个特点,可以通过事件去分离可变动作,支持扩展
控件事件:
启动Form---初始化控件Button---Click事件---+=一个动作
点击按钮--鼠标操作--操作系统收到信号--发送给程序--程序得接受信号,判断控件--登陆--
(事件只能类的内部发生) Button类自己调用Click--肯定是触发了Click事件---登陆动作就会执行
点击按钮--鼠标操作--操作系统收到信号--发送给程序--程序得接受信号,判断控件--支付--
(事件只能类的内部发生) Button类自己调用Click--肯定是触发了Click事件---支付动作就会执行
2次按钮操作,大部分东西都是一样的,就是具体业务不一样的,
封装的控件就完成了固定动作--接受信号&默认动作。。。
可变部分,就是事件---是一个开放的扩展接口,想扩展什么就添加什么
event限制权限,避免外部乱来。
观察者模式三要素
1.事件发布者
发布事件并且在满足条件时触发事件
2订户
关注事件,事件发生后,自己做出对应的动作
3.订阅
把事件发布者和订户关联起来
实现代码
方式一(为事件定义委托,用这个委托类型来定义处理事件的方法类型)
/// <summary> /// 事件发布者,满足条件触发事件 /// </summary> public class MyEventTest { //为事件定义一个委托 public delegate void aEventHandler(); //定义事件(aEventHandler是委托名称) public event aEventHandler eventRun; /// <summary> /// 触发事件的方法 /// </summary> public void TestRun() { //触发的事件 eventRun.Invoke(); //或者eventRun(); 建议使用Invoke,看的清晰一点 } } /// <summary> /// 订户:关注事件,事件发生后,做出自己的动作 /// </summary> public class RunEventTest { /// <summary> /// 定义处理事件的方法 /// </summary> public void Run() { Console.WriteLine("事件开始处理了"); } } //上端调用 MyEventTest myTest = new MyEventTest();//实例化事件发布者 RunEventTest RunEventTest = new RunEventTest();//实例化订户 //订阅:把事件和订户关联起来 myTest.eventRun += new MyEventTest.aEventHandler(RunEventTest.Run); myTest.TestRun();
方式二(为事件封装特定的参数类型)
public class EventStandard { /// <summary> /// 订阅: 把订户和事件关联 /// </summary> public static void Show() { Lesson lesson = new Lesson() { Id = 123, Name = "冬季长款羽绒服", Price = 2699 }; //订阅:把订户和发布者的事件关联起来 lesson.IncreaseHandler += new YongHu().Buy; lesson.IncreaseHandler += new ShangHu().Popularize; lesson.Price = 3999; } } /// <summary> /// 订户:关注事件,事件发生后,自己做出对应的动作 /// </summary> public class YongHu { public void Buy(object sender, EventArgs e) { Lesson lesson = (Lesson)sender; Console.WriteLine($"This is {lesson.Name} Lesson"); XEventArgs args = (XEventArgs)e; Console.WriteLine($"之前价格{args.OldPrice}"); Console.WriteLine($"现在价格{args.NewPrice}"); Console.WriteLine("果断买了!!!"); } } /// <summary> /// 订户2:关注事件,事件发生后,自己做出对应的动作 /// </summary> public class ShangHu { public void Popularize(object sender, EventArgs e) { Lesson lesson = (Lesson)sender; Console.WriteLine($"This is {lesson.Name} Lesson"); XEventArgs args = (XEventArgs)e; Console.WriteLine($"之前价格{args.OldPrice}"); Console.WriteLine($"现在价格{args.NewPrice}"); Console.WriteLine("广大用户请留意!!!"); } } /// <summary> /// 事件参数,一般会为事件封装特定的参数 /// </summary> public class XEventArgs : EventArgs { public int OldPrice { get; set; } public int NewPrice { get; set; } } /// <summary> /// 事件的发布者,发布事件并且在满足条件的时候,触发事件 /// </summary> public class Lesson { public int Id { get; set; } public string Name { get; set; } private int _price; //价格发生变化触发事件 public int Price { get { return this._price; } set { if (value > this._price) { this.IncreaseHandler?.Invoke(this, new XEventArgs() { // OldPrice = this._price, //NewPrice = value OldPrice=value, NewPrice=this._price }); this._price = value; } } } /// <summary> /// 打折事件 /// /// </summary> public event EventHandler IncreaseHandler; } //上端调用 EventStandard.Show();
标签:Console,--,详解,事件,WriteLine,Lesson,public From: https://www.cnblogs.com/JohnTang/p/17058776.html