c#题例-2025-07-27 19:58:40
日期: 2025-07-27 分类: AI写作 7次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、异步编程、闭包、线程安全** 和 **设计模式** 的综合运用,适合考察候选人对 C# 高级特性的理解和实际开发中的问题解决能力。
---
### 🧠 面试题:设计一个线程安全的事件发布/订阅系统
#### 背景描述:
你正在为一个多线程应用程序设计一个轻量级的事件发布/订阅系统(Event Bus),用于模块之间的通信。你需要实现一个 `EventBus` 类,支持多个事件类型,线程安全地订阅、取消订阅和发布事件。
---
### ✅ 题目要求:
实现一个 `EventBus` 类,满足以下功能:
1. **支持多种事件类型订阅**:可以订阅不同类型的事件(如 `EventA`, `EventB`)。
2. **线程安全**:在多线程环境下订阅、取消订阅和发布事件不会引发异常或竞态条件。
3. **支持异步事件处理器**:事件处理函数是 `Func
4. **自动取消订阅**:提供一种机制,使得某个对象(如某个类实例)取消其所有订阅,防止内存泄漏。
5. (加分项)**支持事件处理优先级**:允许订阅者指定处理顺序(例如使用 `[Order]` 特性或参数)。
---
### 📦 示例代码结构:
```csharp
public class EventBus
{
// TODO: 实现以下方法
public void Subscribe
public void Unsubscribe(object subscriber);
public void Unsubscribe
public Task PublishAsync
}
```
---
### 🧪 示例使用方式:
```csharp
public class EventA { public string Message; }
public class EventB { public int Value; }
public class MyHandler
{
public async Task HandleEventA(EventA e)
{
await Task.Delay(10); // 模拟异步操作
Console.WriteLine($"EventA: {e.Message}");
}
public async Task HandleEventB(EventB e)
{
await Task.Delay(10);
Console.WriteLine($"EventB: {e.Value}");
}
}
// 使用示例
var handler = new MyHandler();
var bus = new EventBus();
bus.Subscribe(handler, handler.HandleEventA);
bus.Subscribe(handler, handler.HandleEventB);
await bus.PublishAsync(new EventA { Message = "Hello" });
await bus.PublishAsync(new EventB { Value = 42 });
bus.Unsubscribe(handler); // 取消所有 handler 的订阅
```
---
### 🧾 面试官考察点:
| 考察点 | 说明 |
|--------|------|
| 委托与事件机制 | 是否理解 C# 中的委托、事件、Action/Func 的使用 |
| 泛型编程 | 是否能用泛型支持多种事件类型 |
| 线程安全 | 是否使用 `ConcurrentDictionary`, `lock`, 或其他机制确保线程安全 |
| 异步编程 | 是否能处理异步事件处理器(Func
| 内存管理 | 是否通过 `Unsubscribe` 正确清理事件引用,避免内存泄漏 |
| 高级设计(加分) | 如何实现事件优先级(如通过特性 `[Order(1)]` 或参数) |
---
### 💡 提示(给候选人):
- 使用 `ConcurrentDictionary
- `HandlerWrapper` 可以封装 `Func
- 在 `Unsubscribe` 时,移除所有与此 subscriber 相关的事件处理器。
- 对于优先级,可以在发布事件时对处理器列表排序。
---
### 🎯 附加问题(深入探讨):
- 如果事件处理器抛出异常,你会如何处理?
- 如何测试这个事件总线的线程安全性?
- 如果事件处理函数是同步的,是否可以兼容?
- 如果事件发布频率很高,你会如何优化性能?
---
如果你需要这道题的参考实现或答案解析,我也可以提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐