c#题例-2025-07-26 14:58:35
日期: 2025-07-26 分类: AI写作 11次阅读
当然可以!下面是一道**专家级别**的 **C# 程序员逻辑面试题**,它融合了 C# 的高级特性(如泛型、委托、表达式树、异步编程等),并考察候选人对设计模式和系统架构的理解:
---
### 🧠 **C# 专家级逻辑面试题**
#### **题目:实现一个通用的异步事件总线(Event Bus)系统**
你被要求设计并实现一个**轻量级、线程安全、支持异步处理**的通用事件总线 `IEventBus`,满足以下需求:
---
#### **接口定义**
```csharp
public interface IEventBus
{
///
/// 订阅一个事件类型 TEvent,并在事件发布时调用 handler。
///
void Subscribe
///
/// 取消订阅事件类型 TEvent 的 handler。
///
void Unsubscribe
///
/// 发布一个事件,通知所有订阅者。
///
Task PublishAsync
}
```
---
#### **功能要求**
1. **支持多个事件类型**(例如:`UserCreatedEvent`、`OrderShippedEvent`)。
2. **每个事件类型可以有多个订阅者**。
3. **订阅和取消订阅必须线程安全**。
4. **事件发布是异步的**,并且所有订阅者的 handler 应该并发执行(不阻塞彼此)。
5. **若 handler 抛出异常,应捕获并记录,不影响其他 handler 执行**。
6. **避免内存泄漏**(提示:弱引用或生命周期管理)。
---
#### **附加挑战(可选)**
- 支持基于表达式树(Expression Tree)的事件过滤(例如:只订阅特定用户类型的事件)。
- 支持依赖注入(DI)方式注册 handler(如从 `IServiceProvider` 解析)。
- 支持事件处理顺序(如优先级排序)。
---
#### **面试官期望考察点**
| 考察点 | 说明 |
|--------|------|
| 泛型与委托 | 使用 `Func
| 多线程与线程安全 | 使用 `ConcurrentDictionary` 和 `ConcurrentBag` |
| 异步编程 | `Task` 的并发处理与异常捕获 |
| 内存管理 | 使用弱引用或提供 `Unsubscribe` 接口防止内存泄漏 |
| 设计模式 | 观察者模式、策略模式、工厂模式等 |
| 面向对象设计 | 接口抽象、解耦、可扩展性 |
| 可测试性 | 是否考虑单元测试、mock 友好设计 |
---
### ✅ 示例用法
```csharp
var eventBus = new EventBus();
eventBus.Subscribe
{
Console.WriteLine($"User created: {e.UserName}");
await Task.Delay(100); // 模拟异步操作
});
await eventBus.PublishAsync(new UserCreatedEvent { UserName = "Alice" });
```
---
### 💡 提示(供面试官参考)
- 可使用 `ConcurrentDictionary
- 每个 handler 应封装在 try-catch 中。
- 可以用 `WeakReference` 或引入生命周期管理(如 token)来防止内存泄漏。
- 使用 `Task.Run` 或 `Task.Factory.StartNew` 来并发执行多个 handler。
---
如果你需要我提供参考实现或单元测试代码,也可以告诉我!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐