Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-29 01:33:21

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

---

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

#### 背景说明:
你需要为一个大型系统设计一个**轻量级、线程安全、支持泛型的消息发布/订阅机制(Event Bus)**。多个模块可以通过它来发布消息和订阅感兴趣的事件。

---

### ✅ 要求如下:

1. 实现一个 `IEventBus` 接口,包含以下方法:
- `void Subscribe(Action handler)`
订阅类型为 `T` 的事件。
- `void Unsubscribe(Action handler)`
取消订阅类型为 `T` 的事件。
- `void Publish(T message)`
发布一个类型为 `T` 的事件,通知所有订阅者。

2. 保证线程安全(多线程环境下也能正常工作)。
3. 支持多个订阅者,并避免内存泄漏(比如考虑弱引用或生命周期管理)。
4. 尽可能提高性能,比如使用高效的集合结构进行事件存储与分发。

---

### 📌 示例代码结构:

```csharp
public interface IEventBus
{
void Subscribe(Action handler);
void Unsubscribe(Action handler);
void Publish(T message);
}

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

---

### 💡 扩展问题(可选进阶):

- 如何支持异步处理事件?
- 如果希望每个事件只被某个订阅者处理一次,如何扩展接口?
- 如何支持订阅者按优先级执行?

---

### 🎯 考察点:

| 技术点 | 描述 |
|------------------|------|
| 泛型编程 | 使用泛型支持不同类型的消息 |
| 委托与事件 | 使用 `Action` 进行回调注册 |
| 线程安全 | 多线程下保证数据一致性(如用 `ConcurrentDictionary`, `lock`, `ReaderWriterLockSlim` 等) |
| 内存管理 | 避免因长期持有订阅者的强引导致内存泄漏 |
| 闭包陷阱 | 注意 lambda 表达式在循环中生成的委托是否相等 |
| 设计模式 | 观察者模式、单例模式(通常 Event Bus 是单例) |

---

### 🧪 示例测试代码(供参考):

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

// 订阅
bus.Subscribe(msg => Console.WriteLine("Received: " + msg));
bus.Subscribe(i => Console.WriteLine("Number: " + i));

// 发布
bus.Publish("Hello EventBus"); // 输出 Received: Hello EventBus
bus.Publish(42); // 输出 Number: 42

// 取消订阅
bus.Unsubscribe(msg => Console.WriteLine("Received: " + msg));
bus.Publish("This won't be received."); // 不再输出
```

---

如果你需要这道题的**参考答案**或想了解一种**高性能实现方式**,我也可以继续提供!

是否需要?

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

上一篇:无

下一篇: c#题例-2025-06-28 19:59:57

精华推荐