Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-08 00:51:48

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、闭包、线程安全** 和 **设计模式** 的综合运用:

---

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

#### 背景:
在现代应用程序中,事件总线(Event Bus)是一种常用的设计模式,用于解耦组件之间的通信。你需要编写一个简单的、线程安全的事件总线系统。

---

### ✅ 任务要求:

实现一个泛型类 `ThreadSafeEventBus`,满足以下功能:

1. 支持订阅者通过委托(`Action`)订阅某个事件。
2. 支持发布者向所有订阅者广播消息(即调用所有订阅者的回调函数)。
3. 支持取消订阅。
4. 必须保证线程安全(多个线程同时订阅、取消订阅和发布事件时不能出错)。
5. 订阅者在订阅后若不再使用应可被垃圾回收(防止内存泄漏),考虑弱引用或手动取消订阅机制。

---

### 🔧 接口定义(你可以自行扩展):

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

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

public void Publish(T message) { ... }
}
```

---

### 💡 提示与考察点:

- 使用合适的集合类型(如 `ConcurrentDictionary` 或 `List` + 锁)来管理订阅者。
- 线程安全要考虑并发访问下的正确性,比如使用 `lock`、`ReaderWriterLockSlim` 或 `ConcurrentBag`。
- 垃圾回收问题可以通过弱引用来解决,但更常见的是让使用者显式取消订阅;你也可以结合 `WeakReference` 实现自动清理。
- 可以引入“令牌”机制来支持精确的取消订阅(比如返回 token)。
- 可以扩展为支持事件类型分类(如按事件名称区分),但这不是当前题目要求。

---

### 🧪 示例代码:

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

Action handler = msg => Console.WriteLine("Received: " + msg);

bus.Subscribe(handler);
bus.Publish("Hello EventBus!");

bus.Unsubscribe(handler);
bus.Publish("This should not be received.");
```

---

### 📌 扩展挑战(进阶):

- 如何支持异步处理(每个订阅者在独立线程中执行)?
- 如何限制订阅者最大数量?
- 如何添加优先级排序?

---

这道题目能很好地考察候选人的 C# 综合能力,包括对多线程、委托、泛型、GC机制以及设计模式的理解。是否要我提供一份参考实现?

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

上一篇: c#题例-2025-07-08 06:25:08

下一篇: c#题例-2025-07-07 19:18:35

精华推荐