Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-07 06:58:37

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它融合了 **委托、泛型、闭包、异步编程和线程安全** 的概念,考察候选人对 C# 高级特性的掌握程度以及在复杂场景下的设计能力。

---

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

#### 背景:
你需要为一个大型分布式系统实现一个轻量级的**线程安全事件总线(Event Bus)**。这个事件总线需要支持:

- 订阅者可以通过泛型方式订阅特定类型的事件;
- 支持同步和异步事件处理;
- 保证多线程环境下订阅/取消订阅的安全性;
- 在发布事件时,调用所有已注册的处理函数;
- 提供一种机制来防止内存泄漏(例如使用弱引用或显式取消订阅);

---

### 💡 任务描述:

请实现以下接口:

```csharp
public interface IEventBus
{
void Subscribe(Action handler) where T : class;
void Subscribe(Func handler) where T : class;
void Unsubscribe(Action handler) where T : class;
void Unsubscribe(Func handler) where T : class;

void Publish(T @event) where T : class;
}
```

---

### 🔍 示例代码(期望行为):

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

bus.Subscribe(e => Console.WriteLine($"Sync Log: {e.Message}"));
bus.Subscribe(async e => await LogToDatabaseAsync(e));

bus.Publish(new LogEvent { Message = "Hello World" });
```

输出:
```
Sync Log: Hello World
(同时异步保存到数据库)
```

---

### 📌 进阶要求(可选但加分):

1. 实现基于 `WeakReference` 的自动垃圾回收机制,避免因未取消订阅导致的内存泄漏。
2. 添加事件过滤器(如按来源、标签等),只触发符合条件的处理器。
3. 实现异步处理器的并发控制(例如最大并发数限制)。
4. 支持嵌套事件发布(即在事件处理中再次发布事件)并确保线程安全。

---

### ✅ 考察点:

- 对 `Delegate`, `Action<>`, `Func<,>` 的灵活运用;
- 异步编程模型(`async/await`, `Task`);
- 泛型与类型约束;
- 多线程环境下的资源同步(如使用 `ConcurrentDictionary`, `lock`, `ReaderWriterLockSlim`);
- 内存管理(如弱引用、事件生命周期控制);
- 设计模式理解(观察者模式、发布-订阅模式);

---

如果你希望我提供参考实现或者解析,请告诉我!

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

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

下一篇: c#题例-2025-07-07 01:25:19

精华推荐