Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-14 01:52:56

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、闭包、异步编程和线程安全** 的综合运用,考察候选人对语言特性的深入理解以及在复杂场景下的设计能力。

---

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

#### 背景说明:
你需要实现一个轻量级的线程安全的事件发布/订阅系统(Event Bus),支持多个事件类型,并确保在并发环境下订阅、发布和取消订阅操作的安全性。

---

### 💡 题目要求:

请使用 C# 编写一个泛型 `EventBus` 类,满足以下功能:

1. 支持注册事件处理函数(`Subscribe`)。
2. 支持注销事件处理函数(`Unsubscribe`)。
3. 支持异步发布事件(`PublishAsync`)。
4. 确保线程安全:多个线程可同时调用 `PublishAsync`、`Subscribe` 和 `Unsubscribe`。
5. 处理程序应以“快照”方式执行:在发布过程中即使有人取消订阅,不影响当前正在执行的处理程序列表。
6. 不允许使用第三方库或 `System.Reactive`。

---

### ✅ 示例代码结构:

```csharp
public class EventBus
{
public void Subscribe(Action handler) { ... }

public void Unsubscribe(Action handler) { ... }

public Task PublishAsync(T @event) { ... }
}
```

---

### 🧪 使用示例:

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

bus.Subscribe(s => Console.WriteLine("Received: " + s));

await bus.PublishAsync("Hello");
// 输出:Received: Hello

bus.Unsubscribe(s => Console.WriteLine("Received: " + s));
```

---

### 📌 高阶考点:

- 泛型与委托的高级用法
- `ConcurrentDictionary` 或锁机制的合理使用
- 异步多播委托的执行方式
- 快照行为的实现(复制订阅者列表)
- 对闭包和捕获变量的理解
- `Task.Run()` 是否需要?是否要并行执行?如何异常处理?
- 如何避免内存泄漏?

---

### 🧩 可扩展问题(用于深入追问):

- 如何支持事件继承(如发布 `Dog` 也触发 `Animal` 类型的监听器)?
- 如何实现优先级排序的监听器?
- 如何实现一次性订阅?
- 如何测试线程安全性?
- 如果处理程序抛出异常,应该如何处理?

---

如果你需要这道题的参考答案或解析,请告诉我,我可以为你详细解释实现思路与代码。

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

上一篇: c#题例-2025-07-14 07:26:22

下一篇: c#题例-2025-07-13 20:19:49

精华推荐