C#下的Event

Event其实就是简化的Delegate,被用于Event的delegate只能进行 += (注册)和 -= (反注册)操作,其他的操作被限制了。Event其实是Observer模式在C#的built-in实现。

06-17
### C#Event 的用法与示例 在 C# 中,事件(`event`)是一种特殊的委托类型,用于实现发布-订阅模式。通过事件,对象可以通知其他对象某些操作已经发生或即将发生。以下是关于 C# 事件的详细说明和示例。 #### 1. 事件的基本概念 事件是由一对方法构成的,分别是 `add` 和 `remove` 方法,它们被适当装饰以将方法绑定在一起,并让语言知道这些方法表示事件[^2]。通常情况下,`add` 操作会将提供的委托实例添加到事件处理程序列表中,而 `remove` 操作则将其从列表中移除。 事件的触发方式多种多样,例如按钮点击、超时或未处理的异常等。当事件被触发时,事件处理程序列表中的所有处理程序会被依次调用。需要注意的是,在 C# 中,调用事件处理程序不是事件本身的一部分[^2]。 #### 2. 定义和使用事件 事件通常基于 `EventHandler` 或自定义的委托类型定义。以下是一个简单的事件定义和使用的示例: ```csharp using System; public class Publisher { // 定义一个事件 public event EventHandler<EventArgs> SomethingHappened; protected virtual void OnSomethingHappened(EventArgs e) { // 调用事件 SomethingHappened?.Invoke(this, e); } public void DoWork() { // 模拟工作完成后触发事件 Console.WriteLine("Doing work..."); OnSomethingHappened(new EventArgs()); } } public class Subscriber { public Subscriber(Publisher publisher) { // 订阅事件 publisher.SomethingHappened += HandleSomethingHappened; } private void HandleSomethingHappened(object sender, EventArgs e) { Console.WriteLine("Event handled by subscriber."); } } class Program { static void Main(string[] args) { Publisher publisher = new Publisher(); Subscriber subscriber = new Subscriber(publisher); // 执行工作并触发事件 publisher.DoWork(); } } ``` 输出结果: ``` Doing work... Event handled by subscriber. ``` #### 3. 事件的动态分派 如果事件的参数是动态类型的,则事件的调用会在运行时进行解析。编译器在编译时确定这是一个委托的调用,但由于参数的动态性,实际的解析必须在运行时完成[^3]。 #### 4. 静态事件 静态事件较少使用,但它们允许类的所有实例共享同一个事件。静态事件可以通过类名直接访问,而不需要创建类的实例。例如: ```csharp public class StaticPublisher { public static event EventHandler StaticSomethingHappened; protected static void OnStaticSomethingHappened(EventArgs e) { StaticSomethingHappened?.Invoke(null, e); } public static void DoStaticWork() { Console.WriteLine("Doing static work..."); OnStaticSomethingHappened(new EventArgs()); } } public class StaticSubscriber { public StaticSubscriber() { StaticPublisher.StaticSomethingHappened += HandleStaticSomethingHappened; } private void HandleStaticSomethingHappened(object sender, EventArgs e) { Console.WriteLine("Static event handled by subscriber."); } } class Program { static void Main(string[] args) { StaticSubscriber subscriber = new StaticSubscriber(); // 触发静态事件 StaticPublisher.DoStaticWork(); } } ``` 输出结果: ``` Doing static work... Static event handled by subscriber. ``` #### 5. 注意事项 - **线程安全性**:事件的调用通常不保证线程安全。如果需要在多线程环境中使用事件,应采取适当的同步措施。 - **解除订阅**:为了避免内存泄漏,确保在不再需要时解除事件订阅。 - **泛型事件**:可以使用泛型委托 `EventHandler<T>` 来定义带有自定义数据的事件。 #### 示例代码总结 上述代码展示了如何定义、订阅和触发事件。事件机制是 C# 中实现松耦合设计的重要工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值