Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-14 07:26:22

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

---

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

#### 背景描述:
你需要为一个大型分布式系统实现一个轻量级的**线程安全事件总线 `IEventBus`**,用于在不同模块之间解耦地发布和订阅事件。

---

### 📌 要求:

1. 实现如下接口:

```csharp
public interface IEventBus
{
void Subscribe(string eventName, Action handler);
void Unsubscribe(string eventName, Action handler);
void Publish(string eventName, T @event);
}
```

2. 要求支持:
- 多个事件类型(使用泛型)。
- 同一事件名可被多个订阅者监听。
- 支持动态订阅与取消订阅。
- 线程安全(并发访问时不会出错)。
- 使用合适的集合类型保证性能与安全性(如 `ConcurrentDictionary`, `ConcurrentBag` 等)。

3. 进阶要求(供讨论):
- 如何让 `Publish` 异步执行?
- 如何避免内存泄漏(如捕获了对象但未释放)?
- 如何优化性能?是否可以使用 `WeakReference` 来处理弱引用订阅者?

---

### ✅ 示例代码结构提示:

你可以从以下类开始:

```csharp
public class EventBus : IEventBus
{
private readonly ConcurrentDictionary _handlers = new();

public void Subscribe(string eventName, Action handler)
{
// TODO: 实现订阅逻辑
}

public void Unsubscribe(string eventName, Action handler)
{
// TODO: 实现取消订阅逻辑
}

public void Publish(string eventName, T @event)
{
// TODO: 实现发布逻辑
}
}
```

---

### 💡 考察点解析:

| 技术点 | 考察内容 |
|--------|----------|
| 泛型 | 对泛型方法和类型的正确理解 |
| 委托与闭包 | 是否能正确使用 `Action` 并处理闭包问题 |
| 线程安全 | 是否使用并发集合或锁机制来确保线程安全 |
| 设计模式 | 观察者模式的理解 |
| 内存管理 | 是否考虑内存泄漏、弱引用等高级话题 |
| 异步编程 | 是否能够将同步调用改为异步模型 |

---

### 🧪 可选测试场景示例:

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

eventBus.Subscribe("test", x => Console.WriteLine($"Received: {x}"));

eventBus.Publish("test", 42); // 应输出 "Received: 42"

eventBus.Unsubscribe("test", ???); // 如何正确移除?
```

---

如果你需要我提供参考答案或者想看这道题目的进阶版本(比如引入依赖注入、事件聚合器、消息过滤等),欢迎继续提问 😊

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

上一篇: c#题例-2025-07-14 12:59:39

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

精华推荐