c#题例-2025-07-30 05:58:44
日期: 2025-07-30 分类: AI写作 19次阅读
当然可以!下面是一道**专家级别**的 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
void SubscribeOnce
void Unsubscribe
void Publish
}
```
---
### 🧪 示例使用代码:
```csharp
var bus = new EventBus();
bus.Subscribe
bus.SubscribeOnce
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
标签:AI写作
精华推荐