Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-20 19:31:47

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,考察对 **委托、事件、闭包、异步编程、线程安全、以及设计模式的理解**,非常适合作为高级 C# 工程师或架构师岗位的面试题:

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)并模拟异步发布订阅

#### 📌 背景说明:
在大型系统中,我们经常使用“事件总线”来实现模块之间的解耦。你需要设计并实现一个轻量级的线程安全事件总线,并支持异步订阅。

---

### ✅ 题目要求:

1. 实现一个泛型类 `EventBus`,其中 `T` 是事件的类型。
2. 支持以下功能:
- `Subscribe(Func handler)`:订阅一个异步事件处理器。
- `PublishAsync(T @event)`:异步发布事件,所有订阅者都会被调用。
3. 必须保证线程安全(多个线程同时订阅、发布时不能出错)。
4. 要求支持取消订阅(提示:可以返回一个 `IDisposable` 对象用于取消订阅)。
5. 使用合适的集合类型来存储订阅者,避免内存泄漏。
6. 可选:支持事件过滤(例如按标签订阅)。

---

### 🧩 示例代码结构(接口):

```csharp
public interface IEventBus
{
IDisposable Subscribe(Func handler);
Task PublishAsync(T @event);
}
```

---

### 💡 提示与扩展问题:

- 你为什么选择 `ConcurrentBag>` 或 `List>` 加锁?
- 如何避免在发布事件时订阅者被释放导致的异常?
- 如何实现取消订阅?是否使用弱引用避免内存泄漏?
- 如何在并发发布和订阅时保持一致性?
- 如果某个订阅者执行非常慢,会影响其他订阅者吗?如何优化?
- 如何测试这个事件总线?

---

### 🔍 评估维度:

| 能力维度 | 评估内容 |
|----------|----------|
| 基础语法 | 是否正确使用泛型、委托、异步 |
| 线程安全 | 是否使用锁、并发集合、或快照机制 |
| 设计模式 | 是否使用观察者模式、工厂模式等 |
| 内存管理 | 是否考虑取消订阅、弱引用、资源释放 |
| 异常处理 | 是否处理订阅者的异常,避免阻塞其他订阅者 |
| 扩展性 | 是否易于扩展为支持标签、优先级、同步上下文等 |

---

### ✅ 示例答案(参考):

如果你希望,我可以提供一份参考实现代码。

---

是否需要我继续提供参考实现代码?或者你更想尝试自己写一份看看?

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

上一篇:无

下一篇: c#题例-2025-07-20 13:58:29

精华推荐