[.NET] C# 知识回顾

本文深入讲解C#中的事件概念,包括事件的定义、属性特点、订阅及取消订阅的方法。通过实例演示如何使用IDE、编程方式及匿名方法进行事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C# 知识回顾 - 事件入门

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/6057301.html  

  之前通过《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》介绍了委托的基本知识,这次我们来看看事件。

 

目录

  • What's 事件
  • 事件的属性汇总
  • 事件的订阅和取消
    1. 用 IDE 订阅事件
    2. 以编程方式订阅事件
    3. 用匿名方法订阅事件
    4. 取消订阅

 

一、What's 事件

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

  在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由按钮和列表框等控件引发的事件。可以使用集成开发环境 (IDE) 来浏览控件发布的事件,并选择想要处理的事件。 IDE 将自动添加空白事件处理程序方法和订阅该事件的代码。 

 

二、事件的属性汇总

  • 发行者确定何时引发事件;订户确定对事件作出的响应。

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

  • 没有订户的事件永远也不会引发。

  • 事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。

  • 当事件具有多个订户时,引发该事件时默认会同步调用事件处理程序。

  • 事件基于 EventHandler 委托和 EventArgs 基类。

 

三、事件的订阅和取消

  如果您想编写引发事件时调用的自定义代码,则可以订阅由其他类发布的事件。例如,可以订阅某个按钮的 click 事件,以使应用程序在用户单击该按钮时执行一些有用的操作。  

  1.用 IDE 订阅事件

图3-1-1 新建一个 WinForm 项目

图3-1-2 由图1双击时所自动创建的代码

图3-1-3 除了图2,在 InitializeComponent 方法也自动增加了这行代码

 

  2.以编程方式订阅事件

  假设现在是一个新的 WinForm 程序,我们通过手动的方式自己创建事件。在 InitializeComponent 方法下面输入 this.Load +=,然后会出现提示,这时我们按下“Tab 键”,

 

图3-2-1

 

  会发现也会自动创建事件处理程序,效果跟上一节的直接双击空白处创建的代码可以说是一致的,代码如下:

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6 
 7             this.Load += Form1_Load;
 8         }
 9 
10         private void Form1_Load(object sender, EventArgs e)
11         {
12             throw new NotImplementedException();
13         }
14     }

 

  这次,我们直接采用 lambda 方式完成事件的注册:点击空白处显示鼠标点击时的坐标。

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6 
 7             //this.Load += Form1_Load;
 8 
 9             //点击事件(lambda 方式创建)
10             this.Click += (s, e) =>
11             {
12                 MessageBox.Show($"{((MouseEventArgs)e).Location}");
13             };
14         }
15 
16         private void Form1_Load(object sender, EventArgs e)
17         {
18             throw new NotImplementedException();
19         }
20     }

  【备注】内容涉及 $: (C# 6) 的语法,vs2015 以上才支持。$"{msg}" 相当于 string.Format("{0}", msg), msg 指变量。

 图3-2-2

 

  3.用匿名方法订阅事件

 1         public Form1()
 2         {
 3             InitializeComponent();
 4 
 5             //this.Load += Form1_Load;
 6 
 7             //点击事件(lambda 方式创建)
 8             //this.Click += (s, e) =>
 9             //{
10             //    MessageBox.Show($"{((MouseEventArgs)e).Location}");
11             //};
12 
13             //使用匿名方法创建事件
14             this.Click += delegate (object sender, EventArgs e)
15             {
16                 var mouseEventArgs = (MouseEventArgs)e;
17                 var mouseLocation = mouseEventArgs.Location;
18 
19                 MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
20             };
21         }

  【注意】如果使用匿名函数订阅事件,事件的取消订阅过程将比较麻烦。这种情况下若要取消订阅,必须返回到该事件的订阅代码,将该匿名方法存储在委托变量中,然后将此委托添加到该事件中。一般来说,如果必须在后面的代码中取消订阅某个事件,则建议您不要使用匿名函数订阅此事件。

 

  4.取消订阅

  要防止在引发事件时调用事件处理程序,请取消订阅该事件。要防止资源泄露,应在释放订户对象之前取消订阅事件。在取消订阅事件之前,在发布对象中作为该事件的基础的多路广播委托会引用封装了订户的事件处理程序的委托。只要发布对象保持该引用,垃圾回收功能就不会删除订户对象。使用减法赋值运算符 (-=) 取消订阅事件。

            this.Load -= Form1_Load;  //使用减法赋值运算符 (-=) 取消订阅事件

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

 

 传送门

  《C# 知识回顾 - 序列化》

  《C# 知识回顾 - 表达式树 Expression Trees》

  《C# 知识回顾 - 特性 Attribute》、《剖析 AssemblyInfo.cs - 了解常用的特性 Attribute》

  《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》

 

 


【参考】微软官方文档

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值