什么是事件
- 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。
使用事件
- 如何定义事件
- 使用
event
关键字
访问修饰符 event 委托类型 事件名;
- 订阅与取消事件(使用"+=","-=")
//新郎官类,充当事件发布者角色 class Bridegroom { //自定义委托 public delegate void MarryHandler(string msg); //使用自定义委托类型定义事件,事件名为MarrEvent public event MarryHandler MarrayEvent; //发出事件 public void OnMarriageComing(string msg) { //判断是否绑定了事件处理方法 if (MarrayEvent!=null) { //触发事件 MarrayEvent(msg); } } static void Main(string[] args) { //初始化新郎官对象 Bridegroom bridegroom = new Bridegroom(); //实例化朋友对象 Friend friend1 = new Friend("张三"); Friend friend2 = new Friend("李四"); Friend friend3 = new Friend("王五"); //使用"+="订阅消息 bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage); bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage); //使用"-="取消消息 bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage); //发出通知 bridegroom.OnMarriageComing("到时来参见婚礼!"); Console.ReadLine(); //输出结果为 //到时来参加婚礼! //张三收到了,到时候来参加 } //朋友类 public class Friend { //字段 public string Name; //构造函数 public Friend(string name ) { Name = name; } //事件处理函数,该函数符合MarryHandler委托的定义 public void SendMessage(string mssage) { //输出通知消息 Console.WriteLine(mssage); //对事件做出处理 Console.WriteLine(this.Name+"收到了,到时候来参加"); } } }
- EventHandler系统委托类
EventHandler
系统委托类定义
public delegate void EventHandler(Object sender,EventArgs e);
- 第一个参数
sender
负责保存对触发事件对象的引用,其类型为Object
- 第二个参数
e
负责保存事件数据,EventArgs
也是.NET
类库中定义的类,它不保存任何数据
- 扩展EventArgs类
- 因为
EventHandler
只用于处理不包含事件数据的事件.如果我们想要在由这种方式定义的事件中包含事件数据,则可以通过派生EventArgs
类来实现
namespace MyEvent { //自定义事件类,并使其带有事件数据 public class MarryEventArgs:EventArgs { public string Message; public MarryEventArgs(string msg) { Message = msg; } } //新郎官类,充当事件发布者角色 class Bridegroom { //自定义委托 public delegate void MarryHandler(object sender,MarryEventArgs e); //使用自定义委托类型定义事件,事件名为MarrEvent public event MarryHandler MarrayEvent; //发出事件 public void OnMarriageComing(string msg) { //判断是否绑定了事件处理方法 if (MarrayEvent != null) { //触发事件 MarrayEvent(this,new MarryEventArgs(msg)); } } static void Main(string[] args) { //初始化新郎官对象 Bridegroom bridegroom = new Bridegroom(); //实例化朋友对象 Friend friend1 = new Friend("张三"); Friend friend2 = new Friend("李四"); Friend friend3 = new Friend("王五"); //使用"+="订阅消息 bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage); bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage); //使用"-="取消消息 bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage); //发出通知 bridegroom.OnMarriageComing("到时来参见婚礼!"); Console.ReadLine(); //输出结果为 //到时来参加婚礼! //张三收到了,到时候来参加 } //朋友类 public class Friend { //字段 public string Name; //构造函数 public Friend(string name) { Name = name; } //事件处理函数,该函数符合MarryHandler委托的定义 public void SendMessage(object s,MarryEventArgs e) { //输出通知消息 Console.WriteLine(e.Message); //对事件做出处理 Console.WriteLine(this.Name + "收到了,到时候来参加"); } } } }
- 因为
- 使用
事件的本质
- C#中事件是一个特殊的多路广播委托,事件默认含有一个私有的委托变量,该变量用于保存对事件处理方法的引用,且该委托类型的变量为私有,只能从定义该事件的类中进行访问