c#题例-2025-07-20 13:58:29
日期: 2025-07-20 分类: AI写作 13次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、闭包、异步编程、线程安全** 和 **设计模式** 的综合运用,适合考察候选人的高级语言特性和系统设计能力。
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)
#### 题目描述:
请使用 C# 实现一个 **线程安全的事件总线(Thread-Safe EventBus)**,支持以下功能:
1. **订阅事件(Subscribe)**
- 支持注册一个事件处理器(`Action
- 返回一个 `IDisposable` 对象,用于取消订阅。
2. **发布事件(Publish)**
- 支持发布一个事件对象 `T`,通知所有订阅了该事件类型的处理器。
3. **异步事件处理(可选)**
- 支持异步处理事件(即 `Func
4. **支持事件继承(可选)**
- 如果事件类型是某个类型的子类,也能触发父类的订阅者(例如:`EventB` 继承 `EventA`,订阅 `EventA` 的处理器也能接收到 `EventB`)。
5. **线程安全**
- 多线程环境下能安全地订阅、取消订阅和发布事件。
---
### ✅ 示例代码结构(接口定义):
```csharp
public interface IEventBus : IDisposable
{
IDisposable Subscribe
IDisposable SubscribeAsync
Task PublishAsync
void Publish
}
```
---
### 💡 考察点:
| 考点 | 说明 |
|------|------|
| 委托与泛型 | 能正确使用 `Action
| 闭包与线程安全 | 使用合适的锁(如 `ReaderWriterLockSlim` 或 `ConcurrentDictionary`)保证并发安全 |
| IDisposable 实现 | 正确管理订阅生命周期 |
| 异步编程 | 使用 `Task` 和 `await` 正确分发异步事件 |
| 事件继承机制(高级) | 使用反射或类型匹配实现事件继承传播 |
| 性能优化 | 如避免在发布事件时频繁加锁,使用快照或不可变集合等优化策略 |
---
### 🧪 示例使用:
```csharp
var eventBus = new EventBus();
eventBus.Subscribe
eventBus.SubscribeAsync
eventBus.Publish(new LoginEvent { Username = "Alice" });
await eventBus.PublishAsync(new LogoutEvent { Username = "Alice" });
```
---
### 📌 提示:
- 可以用 `ConcurrentDictionary
- 注意在发布事件时避免 `ConcurrentModificationException`。
- 可以使用 `ImmutableList
- 对于事件继承,可以使用 `Type.IsAssignableFrom()` 判断事件类型匹配。
---
如果你需要我提供一份参考实现,请告诉我!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐