Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-12 20:51:47

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **泛型、委托、闭包、线程安全以及设计模式的理解**,适合考察高级开发人员对语言特性和系统设计能力的掌握。

---

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

#### 背景:
你需要为一个大型分布式系统设计一个轻量级的**线程安全事件总线(Event Bus)**,用于在不同模块之间解耦通信。该事件总线需要支持订阅和发布任意类型的事件,并且保证在多线程环境下不会出现竞争条件或内存泄漏。

---

### ✅ 题目要求:

请你实现一个 `IEventBus` 接口的完整类 `ThreadSafeEventBus`,满足以下功能:

```csharp
public interface IEventBus
{
void Subscribe(Action handler) where T : class;
void Unsubscribe(Action handler) where T : class;
void Publish(T @event) where T : class;
}
```

#### 功能说明:

- `Subscribe`:注册一个处理特定类型事件的回调。
- `Unsubscribe`:取消注册某个回调。
- `Publish`:发布一个事件,通知所有已订阅的回调。

---

### 🚫 约束与要求:

1. **线程安全**:多个线程可能同时调用 `Publish`、`Subscribe` 和 `Unsubscribe`,必须确保线程安全。
2. **避免内存泄漏**:若使用 `WeakReference` 或其他机制防止内存泄漏,请解释其原理并正确实现。
3. **性能优化**:频繁发布事件时,应尽量减少锁的粒度,提升性能。
4. **支持多次订阅/取消订阅**:相同回调可被多次订阅,取消一次即解除绑定。
5. (加分项)支持一次性订阅(once),即回调只执行一次后自动取消订阅。

---

### 💡 提示:

- 可以使用 `ConcurrentDictionary` 来管理不同类型事件的订阅者。
- 使用 `ReaderWriterLockSlim` 或 `lock` 来保护资源访问。
- 若使用弱引用,请注意处理目标回收后的清理工作。
- 可考虑封装一个 `SubscriptionToken` 来管理订阅关系。

---

### 示例代码结构:

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

---

### 🎯 考察点总结:

| 技术点 | 是否考察 |
|------------------|----------|
| 泛型使用 | ✅ |
| 委托与事件机制 | ✅ |
| 线程同步与并发控制 | ✅ |
| 内存管理与弱引用 | ✅(加分) |
| 设计模式理解(观察者等) | ✅ |
| 代码结构与可维护性 | ✅ |

---

如果你需要参考答案或提示,我可以为你提供一份完整的实现方案 😊

是否要我给出参考实现?

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

上一篇:无

下一篇: c#题例-2025-07-12 15:18:28

精华推荐