嘉兴优化网站价格,wordpress 文章 列表,网络推广推荐徐州百度网络专注,洮南做网站事件模型的5个组成部分 事件拥有者#xff08;event source#xff09;#xff08;类对象#xff09;#xff08;有些书将其称为事件发布者#xff09; 事件成员#xff08;event#xff09;#xff08;事件拥有者的成员#xff09;#xff08;事件成员就是事件本身…事件模型的5个组成部分 事件拥有者event source类对象有些书将其称为事件发布者 事件成员event事件拥有者的成员事件成员就是事件本身事件不会主动发生其只会在事件拥有者的内部逻辑的触发下发生。 事件响应者event subscriber类对象有些书将其称为事件订阅者 事件处理器event handler事件的响应者的成员根据拿到的事件参数/信息对事件进行处理 事件订阅委托类型
举个栗子妈妈喊儿子回家吃饭儿子听到立马跑回家。
在上面这个例子中事件拥有者是妈妈Mother事件成员是喊Say事件响应者是儿子Son事件处理是跑步回家Gohome。
接下来我们尝试去写这个过程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp5event
{//事件拥有者event source类对象有些书将其称为事件发布者//事件成员event事件拥有者的成员事件成员就是事件本身事件不会主动发生其只会在事件拥有者的内部逻辑的触发下发生。//事件响应者event subscriber类对象有些书将其称为事件订阅者//事件处理器event handler事件的响应者的成员根据拿到的事件参数/信息对事件进行处理//事件订阅委托类型 delegate)//举个栗子1“裁判员开枪运动员开始跑步。”//1.1事件拥有者是裁判员//1.2事件成员是开枪//1.3事件响应者是运动员//1.4事件处理是开始跑步。//举个栗子2这是WinForm编程中常用的一种方式比如在一个窗体中存在一个文本框和按钮现在要通过点击按钮让文本框上显示出文字“Hello World”。//2.1发生的事件是鼠标点击//2.2事件拥有者是按钮Button鼠标点击的是它它是窗体对象的一个字段成员//2.3事件响应者是窗体对象//2.4事件处理是窗体对象让自己的字段成员文本框TextBox显示出文字“Hello World”。//从发生到响应的5个动作:①事件拥有者拥有一个事件→②事件响应者订阅了这个事件→③事件拥有者触发了事件→④事件响应者会被依次通知到按照订阅的顺序→⑤事件响应者根据拿到的事件参数对事件进行处理//下面的示例是你妈妈喊“回家吃饭”你儿子跑步回家。//事件拥有者是妈妈//事件成员是喊话//事件响应者是儿子//事件处理是跑步回家。//在声明事件之前需要先声明一个委托类型来作为约束即事件订阅其约束了事件喊话能够发送什么事件参数给事件响应者(儿子)以及当事件响应者儿子的事件处理器跑步回家符合规定时即符合委托类型指定的签名和返回值类型事件订阅要将其保存起来即委托字段引用方法。根据命名规范该委托应该命名为“事件名EventHandler”。//可以将事件标记为public、private、protected、internal、protected internal 或 private protected。 这些访问修饰符定义该类的用户访问该事件的方式。 internal class Program{static void Main(string[] args){Mother mother new Mother();//事件的拥有者Son son new Son();//事件的相应者mother.Say son.Gohome; //事件Say事件处理器gohome事件订阅 也就是只要妈妈说话了儿子就时时刻刻接收妈妈说的话mother.SayingProcess(); //触发事件模拟妈妈喊儿子回家过程Console.ReadKey();}}//用于传递事件参数事件信息的类该例子中主要用于将妈妈的话传递给儿子public class SayEventArgs : EventArgs{public String sentence { get; set; } //说了什么话}//声明委托类型事件订阅//第1个参数为事件拥有者妈妈第2个参数是用来存储喊儿子回家的相关信息事件参数 public delegate void SayEventHandler(Mother mother, SayEventArgs e);//妈妈类事件拥有者public class Mother{//根据前面声明的委托类型来创建一个委托类型字段用来触发事件处理器儿子回家private SayEventHandler sayEventHandler;//声明事件//event为事件关键字SayEventHandler表示用此委托来约束该事件public event SayEventHandler Say{//添加事件处理器add{sayEventHandler value;}//删除事件处理器remove{sayEventHandler - value;}}//下面的Say就相当于上面的Say事件和儿子的动作进行绑定和SayEventArgs事件传输参数用于将妈妈的话传给儿子//public void Say(string sentence)//{// Console.WriteLine(妈妈说sentence);//}//模拟妈妈喊儿子的过程public void SayingProcess(){Console.WriteLine(输入回车后开始模拟妈妈做好饭喊儿子回家);Console.ReadLine();Console.WriteLine(妈妈已经做好饭了);Thread.Sleep(1000);Console.WriteLine(妈妈走向窗户边);Thread.Sleep(1000);Console.WriteLine(妈妈准备喊话);Thread.Sleep(1000);//触发事件if (sayEventHandler ! null) //若不存在任何事件处理器则无法触发事件{//准备好事件参数即准备好妈妈想说的话SayEventArgs e new SayEventArgs();e.sentence 儿子回家吃饭了;Console.WriteLine(妈妈说“e.sentence”);Thread.Sleep(1000);//调用事件处理器就是sayEventHandler(this, e);e.sentence 儿子买点盐去家里没有盐了;Console.WriteLine(妈妈说“ e.sentence ”);Thread.Sleep(1000);sayEventHandler(this, e);}}}//儿子类事件响应者public class Son{//想儿子要回家的话首先得有妈妈约束所以第一个参数是事件的拥有者其次是妈妈做了什么喊吃饭所以第二个参数是事件才能让儿子回家//此处的参数必须与SayEventHandler一样public void Gohome(Mother mother, SayEventArgs e){Thread.Sleep(1000);Console.WriteLine(儿子接收到妈妈的话e.sentence);Thread.Sleep(1000);if (e.sentence.Contains(回家)){Console.WriteLine(儿子说“好的妈妈我马上回家吃饭”);}else {Console.WriteLine(儿子说“妈妈自己去买呗我还想在外面玩会”);} }}}运行结果如下 参考文献
event - C# 参考 - C# | Microsoft Learn
C# 事件(event)_c# event_熊思宇的博客-CSDN博客
C#中的事件event_c# event_香芋派丶的博客-CSDN博客