Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-07 11:25:05

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,考察候选人在 **泛型、委托、闭包、异步编程、线程安全** 等方面的综合掌握能力:

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)

#### 背景描述:

在大型系统中,事件总线(Event Bus)常用于模块之间的解耦通信。你需要实现一个简单的泛型事件总线,支持订阅、发布和取消订阅操作,并确保线程安全。

---

### ✅ 题目要求:

请使用 C# 实现一个名为 `EventBus` 的类,满足以下要求:

1. 支持泛型事件类型,即每个事件类型 `TEvent` 有自己独立的订阅者列表。
2. 提供以下方法:
- `Subscribe(Action handler)`
订阅某个事件类型,返回一个用于取消订阅的 `IDisposable` 对象。
- `Publish(TEvent @event)`
异步发布一个事件,所有订阅者都应该被调用。
3. 所有订阅者必须在**发布事件时同步执行**(即不要使用 `Task.Run` 等启动新任务)。
4. 线程安全:多个线程可以同时调用 `Subscribe`、`Unsubscribe` 和 `Publish`。
5. 取消订阅必须高效,不能造成内存泄漏。

---

### 🔍 示例代码结构:

```csharp
public interface IEventBus
{
IDisposable Subscribe(Action handler);
void Publish(TEvent @event);
}

public class EventBus : IEventBus
{
// 实现细节
}
```

---

### 💡 提示:

- 使用 `ConcurrentDictionary>` 来保存每个事件类型的订阅者。
- 每个 `Subscribe` 返回的 `IDisposable` 应该能取消对应的订阅。
- 使用 `ReaderWriterLockSlim` 或 `lock` 来保证线程安全。
- 注意避免闭包捕获导致的内存泄漏。
- 可以考虑使用 `WeakReference` 实现弱引用订阅者(加分项)。

---

### 🧪 测试用例(可选):

```csharp
var bus = new EventBus();

int count = 0;
var subscription = bus.Subscribe(x => count += x);

bus.Publish(5);
bus.Publish(10);

Console.WriteLine(count); // 应输出 15

subscription.Dispose();

bus.Publish(20);
Console.WriteLine(count); // 仍应输出 15
```

---

### 🧩 考察点总结:

| 技术点 | 是否考察 |
|----------------------|----------|
| 泛型编程 | ✅ |
| 委托与事件模型 | ✅ |
| 线程安全与并发控制 | ✅ |
| IDisposable 模式 | ✅ |
| 闭包与内存泄漏 | ✅ |
| 异步与同步上下文理解 | ✅ |
| 架构设计与解耦能力 | ✅ |

---

如果你需要我提供一个参考实现或解析,也可以告诉我!

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

上一篇: c#题例-2025-08-07 16:58:28

下一篇: c#题例-2025-08-07 05:51:56

精华推荐