温故而知新事件

事件概述

类或对象可以通过时间向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。

事件特点:

发行者确定何时引发事件,订户确定执行何种操作来响应该事件。

一个事件可以有多个订户。一个订户可以处理来自多个发行者的事件。

没有订户的时间永远不会引发。

事件通常用户通知用户操作,如:图形用户界面中的按钮单击或菜单选择操作。

如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。(可以使用异步方式调用同步方法)。

在.NET Framwork类库中,事件是基于EventHandler委托和EventArgs基类的。 

订阅和取消订阅事件

1.使用VS IDE订阅事件

属性→事件→要创建的事件(如Load事件)。

Visual C#会创建一个空事件处理程序方法,并将其添加到你的代码中。你也可以在“代码”视图中手动添加代码。

1 private void Form1_Load(object sender, EventArgs e)
2         {
3 
4         }

还会在项目的Form1.Designer.cs文件的InitializaComponent方法中自动生成订阅该事件所需的代码。如下:

1 this.Load += new System.EventHandler(this.Form1_Load);

2.以编程方式订阅事件
定义一个事件处理程序方法,其签名与该事件的委托签名匹配。

 1 public Form1()
 2         {
 3             InitializeComponent();
 4         }
 5 
 6         private void Form1_Load(object sender, EventArgs e)
 7         {
 8             label2.Text = "加载...";
 9         }
10         void HandleEvent(object sender, EventArgs a)
11         {
12             label1.Text = "使用编程订阅事件!";
13         }

使用假发赋值运算符(+=)来为事件附加事件处理程序。

1 this.Load += new System.EventHandler(this.Form1_Load);
2             this.Load += new System.EventHandler(this.HandleEvent);

还可以使用Lambda表达式添加事件处理程序:

1 public Form1()
2         {
3             InitializeComponent();
4             this.Click += (s, e) =>
5             {
6                 MessageBox.Show(
7                     ((MouseEventArgs)e).Location.ToString());
8             };
9         }

3.使用匿名方法订阅事件

如果以后不必取消订阅某个事件,则可以使用假发赋值运算符(+=)将匿名方法附加发哦此事件。

1 this.Load += new System.EventHandler(this.Form1_Load);
2             //this.Load += new System.EventHandler(this.HandleEvent);
3             this.Load += new System.EventHandler(delegate(object o, EventArgs e) { label1.Text = "使用匿名方法"; });

一般不建议使用匿名函数订阅事件。

取消订阅事件

使用剪发运算符(-=)取消订阅事件:

1 this.Load -= new System.EventHandler(this.HandleEvent);

所有订户都取消订阅事件后,发行者类中的事件实例将设置为null。

原文地址:https://www.cnblogs.com/zhangxiaohui/p/2560097.html