上一篇: 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
的类,该类具有 Subscribe
和 Unsubscribe
方法,用于分别订阅和取消订阅
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# 中定义和使用事件。