c#题例-2025-07-06 19:51:52
日期: 2025-07-06 分类: AI写作 20次阅读
当然可以!以下是一道**专家级别**的 C# 逻辑面试题,它不仅考察语言基础,还涉及对 **委托、事件、闭包、线程安全** 和 **设计模式** 的理解:
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)
#### 背景:
在现代应用程序中,事件总线(Event Bus)是一个常见的组件,用于解耦模块之间的通信。你需要实现一个简单的、线程安全的事件总线。
#### 要求:
1. 实现一个泛型类 `EventBus
2. 支持多个订阅者(通过委托或 Action 接收事件)。
3. 订阅者可以在任意线程注册或注销。
4. 发布事件时,所有订阅者都应被调用,并且调用顺序不作要求。
5. 必须确保线程安全(多线程下添加/移除订阅者和发布事件不会导致异常或数据损坏)。
6. 不允许使用 .NET 提供的 `System.Event` 或任何并发集合(如 `ConcurrentDictionary`)。
#### 示例代码框架如下:
```csharp
public class EventBus
{
public void Subscribe(Action
public void Unsubscribe(Action
public void Publish(T @event) { ... }
}
```
#### 使用示例:
```csharp
var bus = new EventBus
bus.Subscribe(msg => Console.WriteLine("Subscriber 1: " + msg));
bus.Subscribe(msg => Console.WriteLine("Subscriber 2: " + msg));
bus.Publish("Hello World");
```
输出示例(顺序可能不同):
```
Subscriber 1: Hello World
Subscriber 2: Hello World
```
---
### 💡 考察点:
- 对 C# 委托和事件机制的理解。
- 线程安全与锁的合理使用(例如 `lock`、`ReaderWriterLockSlim`)。
- 避免委托引用泄漏问题。
- 是否考虑了深拷贝或快照机制来避免在遍历时修改集合的问题。
- 编码规范与性能优化意识。
---
### ✅ 参考答案提示(不展开,面试时由候选人写出):
- 使用 `List
- 使用 `lock` 保证订阅和取消订阅的原子性。
- 在 `Publish` 方法中创建订阅者的副本再逐个调用以避免线程竞争。
- 可选地支持弱引用防止内存泄漏(加分项)。
---
如果你需要这道题的完整参考实现,请告诉我,我可以为你提供。希望这道题能帮助你评估一位 C# 工程师的真实水平!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐