Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-27 19:58:40

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、异步编程、闭包、线程安全** 和 **设计模式** 的综合运用,适合考察候选人对 C# 高级特性的理解和实际开发中的问题解决能力。

---

### 🧠 面试题:设计一个线程安全的事件发布/订阅系统

#### 背景描述:

你正在为一个多线程应用程序设计一个轻量级的事件发布/订阅系统(Event Bus),用于模块之间的通信。你需要实现一个 `EventBus` 类,支持多个事件类型,线程安全地订阅、取消订阅和发布事件。

---

### ✅ 题目要求:

实现一个 `EventBus` 类,满足以下功能:

1. **支持多种事件类型订阅**:可以订阅不同类型的事件(如 `EventA`, `EventB`)。
2. **线程安全**:在多线程环境下订阅、取消订阅和发布事件不会引发异常或竞态条件。
3. **支持异步事件处理器**:事件处理函数是 `Func` 类型。
4. **自动取消订阅**:提供一种机制,使得某个对象(如某个类实例)取消其所有订阅,防止内存泄漏。
5. (加分项)**支持事件处理优先级**:允许订阅者指定处理顺序(例如使用 `[Order]` 特性或参数)。

---

### 📦 示例代码结构:

```csharp
public class EventBus
{
// TODO: 实现以下方法
public void Subscribe(object subscriber, Func handler, int order = 0);
public void Unsubscribe(object subscriber);
public void Unsubscribe(object subscriber);
public Task PublishAsync(TEvent @event);
}
```

---

### 🧪 示例使用方式:

```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

上一篇:无

下一篇: c#题例-2025-07-27 14:25:16

精华推荐