Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-30 05:58:44

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、闭包、线程安全** 和 **设计模式** 的综合应用,适合考察候选人在实际开发中对 C# 特性的深入理解和灵活运用能力:

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)

#### **题目描述:**

请使用 C# 实现一个**线程安全的事件总线(Event Bus)系统**,满足以下要求:

1. 支持注册多个事件订阅者(`Subscribe` 方法)。
2. 支持发布事件(`Publish` 方法),通知所有订阅者。
3. 支持泛型事件类型(例如:`EventA`, `EventB`)。
4. 支持取消注册(`Unsubscribe`)。
5. 必须是线程安全的(支持并发注册、取消注册和发布)。
6. 支持一次性订阅(只处理一次事件,然后自动取消注册)。
7. 请不要使用任何第三方库(如 `System.Reactive`)。

#### **接口定义参考:**

```csharp
public interface IEventBus
{
void Subscribe(Action handler) where T : class;
void SubscribeOnce(Action handler) where T : class;
void Unsubscribe(Action handler) where T : class;
void Publish(T @event) where T : class;
}
```

---

### 🧪 示例使用代码:

```csharp
var bus = new EventBus();

bus.Subscribe(e => Console.WriteLine($"User logged in: {e.Username}"));
bus.SubscribeOnce(e => Console.WriteLine($"User logged out: {e.Username}"));

bus.Publish(new LoginEvent { Username = "Alice" });
bus.Publish(new LogoutEvent { Username = "Alice" });
bus.Publish(new LogoutEvent { Username = "Alice" }); // 这个不应该再触发
```

---

### ✅ 考察点解析:

| 考点 | 说明 |
|------|------|
| 泛型委托 | 使用 `Action` 作为订阅者 |
| 线程安全 | 使用 `ConcurrentDictionary` 或锁机制保护共享状态 |
| 闭包与委托比较 | 判断两个 `Action` 是否相同(用于取消订阅) |
| 一次性订阅 | 需要封装一个机制,在执行一次后自动取消订阅 |
| 事件聚合设计 | 如何组织不同事件类型与订阅者之间的映射关系 |
| 内存泄漏预防 | 是否使用弱引用或确保及时取消注册(加分项) |

---

### 💡 参考实现提示:

- 使用 `ConcurrentDictionary>` 存储不同事件类型的订阅者。
- 对于一次性订阅,可以用封装器(wrapper)在调用后自动取消注册。
- 可使用 `lock` 或 `Interlocked` 等机制确保线程安全。
- 注意 `Action` 委托的比较逻辑,避免无法取消注册的问题。

---

如果你需要我提供一个参考实现或者想继续深入探讨该设计的扩展性(如支持异步、优先级、过滤等),欢迎继续提问!

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: c#题例-2025-07-30 11:32:05

下一篇: c#题例-2025-07-30 00:25:30

精华推荐