Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-26 14:58:35

当然可以!下面是一道**专家级别**的 **C# 程序员逻辑面试题**,它融合了 C# 的高级特性(如泛型、委托、表达式树、异步编程等),并考察候选人对设计模式和系统架构的理解:

---

### 🧠 **C# 专家级逻辑面试题**

#### **题目:实现一个通用的异步事件总线(Event Bus)系统**

你被要求设计并实现一个**轻量级、线程安全、支持异步处理**的通用事件总线 `IEventBus`,满足以下需求:

---

#### **接口定义**

```csharp
public interface IEventBus
{
///


/// 订阅一个事件类型 TEvent,并在事件发布时调用 handler。
///

void Subscribe(Func handler) where TEvent : class;

///
/// 取消订阅事件类型 TEvent 的 handler。
///

void Unsubscribe(Func handler) where TEvent : class;

///
/// 发布一个事件,通知所有订阅者。
///

Task PublishAsync(TEvent @event) where TEvent : class;
}
```

---

#### **功能要求**

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(async e =>
{
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

上一篇: c#题例-2025-07-26 20:31:59

下一篇: c#题例-2025-07-26 09:25:01

精华推荐