上一篇: C# 委托(Delegate)

下一篇: C# 集合(Collection)

C# 事件(Event)

在本教程中,您将学习如何在 C# 中使用事件。事件是一种特殊的委托类型,使类可以向其他类或对象发送通知,以便在某些操作发生时执行相应的动作。

基本概念

以下是与 C# 事件相关的基本概念:

  • 事件(Event) :一种特殊的委托类型,用于允许类发布通知,以便在发生特定情况时执行相应的代码。
  • 发布者(Publisher) :触发事件并通知订阅者的类或对象。
  • 订阅者(Subscriber) :响应事件并执行相应操作的类或对象。
  • 事件处理程序(Event Handler) :当事件被触发时需要执行的方法。

创建事件

首先,创建一个简单的 AlarmClock 类,该类具有一个名为 AlarmRang 的事件。然后,定义一个名为 RangEventArgs 的自定义事件参数类,该类包含有关事件的附加信息。

                using System;

                public class RangEventArgs : EventArgs
                {
                    public DateTime Time { get; set; }
                }

                public class AlarmClock
                {
                    public event EventHandler<RangEventArgs> AlarmRang;

                    protected virtual void OnAlarmRang(RangEventArgs e)
                    {
                        AlarmRang?.Invoke(this, e);
                    }

                    public void SetAlarm(DateTime time)
                    {
                        // 模拟闹钟响铃
                        System.Threading.Thread.Sleep((int)(time - DateTime.Now).TotalMilliseconds);
                        OnAlarmRang(new RangEventArgs { Time = time });
                    }
                }
                

在这个例子中,我们定义了一个 AlarmRang 事件,其类型为 EventHandler<RangEventArgs>。我们还提供了一个名为 OnAlarmRang 的保护虚方法,以触发事件并通知订阅者。最后,我们添加了一个名为 SetAlarm 的方法来设置闹钟。

使用事件

接下来,创建一个订阅 AlarmClock 类的 AlarmRang 事件的类。订阅事件意味着将事件处理程序添加到发布者类的事件中。

                public class AlarmListener
                {
                    public void Subscribe(AlarmClock alarmClock)
                    {
                        alarmClock.AlarmRang += AlarmClock_AlarmRang;
                    }

                    public void Unsubscribe(AlarmClock alarmClock)
                    {
                        alarmClock.AlarmRang -= AlarmClock_AlarmRang;
                    }

                    private void AlarmClock_AlarmRang(object sender, RangEventArgs e)
                    {
                        Console.WriteLine($"Alarm rang at {e.Time.ToString()}");
                    }
                }
                

在这个例子中,我们创建了一个名为 AlarmListener 的类,该类具有 SubscribeUnsubscribe 方法,用于分别订阅和取消订阅 AlarmClock 类的 AlarmRang 事件。我们还定义了一个名为 AlarmClock_AlarmRang 的事件处理程序,该程序将在事件触发时执行。

示例

下面的示例演示了如何在 C# 中使用事件。

                class Program
                {
                    static void Main(string[] args)
                    {
                        AlarmClock alarmClock = new AlarmClock();
                        AlarmListener listener = new AlarmListener();

                        // 订阅事件
                        listener.Subscribe(alarmClock);

                        // 设置闹钟
                        DateTime alarmTime = DateTime.Now.AddSeconds(5);
                        Console.WriteLine($"Setting alarm for {alarmTime.ToString()}");
                        alarmClock.SetAlarm(alarmTime);

                        // 取消订阅事件(如果需要)
                        // listener.Unsubscribe(alarmClock);

                        Console.ReadLine();
                    }
                }
                

输出结果(闹钟响铃后):

                Setting alarm for [time after 5 seconds]
                Alarm rang at [time after 5 seconds]
                

总结

在本教程中,您学习了如何在 C# 中定义和使用事件。