11 委托和事件之事件的概念与用法

在上一篇文章中,我们介绍了委托的定义与使用。现在,来深入探讨与委托密切相关的另一重要概念——事件。事件是C#中一种重要的异步编程方式,能够让多个对象之间进行高效的通信。接下来,我们将一起学习事件的概念、用法,以及一些常见的使用场景。

什么是事件

事件(Event)是基于委托的一个高级概念。它使得类或对象可以向外界发布通知,传递状态变化或某些行为的发生。事件为对象之间提供了一种松耦合的通信方式。

在C#中,事件通常用于响应用户交互(如按钮点击)、传递状态变化(如进度更新),以及在多线程环境中处理任务完成的通知。

事件的定义

事件的定义通常遵循以下步骤:

  1. 定义一个委托类型,作为事件的类型。
  2. 在类中定义一个事件,使用委托类型。
  3. 提供一个方法,用于触发事件。

以下是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 步骤1: 定义一个委托类型
public delegate void TemperatureChangedEventHandler(object sender, TemperatureChangedEventArgs e);

// 步骤2: 定义事件参数
public class TemperatureChangedEventArgs : EventArgs
{
public float NewTemperature { get; }

public TemperatureChangedEventArgs(float newTemperature)
{
NewTemperature = newTemperature;
}
}

// 步骤3: 创建一个包含事件的类
public class Thermostat
{
// 定义事件
public event TemperatureChangedEventHandler TemperatureChanged;

private float _temperature;

public float Temperature
{
get => _temperature;
set
{
// 当温度改变时,触发事件
if (_temperature != value)
{
_temperature = value;
OnTemperatureChanged(new TemperatureChangedEventArgs(value));
}
}
}

protected virtual void OnTemperatureChanged(TemperatureChangedEventArgs e)
{
TemperatureChanged?.Invoke(this, e);
}
}

在上面的代码中:

  • 我们首先定义了一个委托 TemperatureChangedEventHandler,用于表示事件处理程序。
  • 然后,我们定义了一个事件参数类 TemperatureChangedEventArgs,携带温度变化的值。
  • 接下来,在 Thermostat 类中,我们定义了 Temperature 属性,并在其值更改时触发 TemperatureChanged 事件,通过 OnTemperatureChanged 方法来激活事件。

订阅和触发事件

一旦定义了事件,其他对象可以通过订阅(订阅即将事件的处理函数附加到事件上)来监听该事件。下面是一个关于如何订阅事件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Program
{
static void Main()
{
Thermostat thermostat = new Thermostat();

// 订阅事件
thermostat.TemperatureChanged += Thermostat_TemperatureChanged;

// 改变温度,触发事件
thermostat.Temperature = 22.5f;
thermostat.Temperature = 23.0f;
}

private static void Thermostat_TemperatureChanged(object sender, TemperatureChangedEventArgs e)
{
Console.WriteLine($"Temperature changed to: {e.NewTemperature}°C");
}
}

在这个例子中:

  • 我们创建了 Thermostat 类的实例,并使用 += 运算符来订阅 TemperatureChanged 事件。
  • 当温度被设置时,相关的事件处理程序 Thermostat_TemperatureChanged 会被调用,输出新的温度值。

事件的特点

  • 多播委托:一个事件可以有多个订阅者。当事件被触发时,所有订阅者的事件处理方法会按顺序执行。
  • 安全性:事件的触发通常是封装在类的内部,外部对象不能直接触发事件,只能通过改变状态。
  • 减少耦合:通过事件,一个类可以与另一个类进行通信,而不需要直接引用它,从而减少了代码的耦合度。

结论

通过本篇文章,我们理解了事件的概念和用法。事件为C#开发者提供了一种强大的机制来实现对象之间的通信,从而可以更灵活地构建应用程序结构。在下一篇文章中,我们将讨论命名和泛型委托,进一步拓展对委托和事件的认知。希望大家继续关注!

11 委托和事件之事件的概念与用法

https://zglg.work/csharp-one/11/

作者

IT教程网(郭震)

发布于

2024-08-13

更新于

2024-08-13

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论