Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-19 21:18:26

当然可以!以下是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、闭包、异步编程、线程安全** 等多个高级概念,考察候选人对 C# 语言特性的深入理解和实际应用能力:

---

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

#### 📌 题目描述:

请你使用 C# 实现一个 **线程安全的事件总线(Event Bus)系统**,满足以下要求:

1. 支持注册和取消注册事件处理函数(使用泛型)。
2. 支持发布事件,所有订阅该事件的处理函数都会被调用。
3. 事件处理函数可以是同步或异步(`Func` 或 `Action`)。
4. 必须保证线程安全(支持并发注册、取消注册和发布事件)。
5. 避免内存泄漏(比如弱引用或自动清理无效订阅)可选加分。
6. 提供一个简单的使用示例。

---

### 示例接口定义(仅供参考):

```csharp
public interface IEventBus
{
void Subscribe(Action handler);
void Subscribe(Func handler);
void Unsubscribe(Action handler);
void Unsubscribe(Func handler);
void Publish(TEvent @event);
}
```

---

### 🎯 考察点:

- 委托与泛型的灵活使用。
- 线程安全(如使用 `ConcurrentDictionary`, `ReaderWriterLockSlim`, `lock` 等)。
- 异步编程模型(如何处理同步和异步混合的事件处理器)。
- 事件生命周期管理。
- 对 `Action` 与 `Func` 的理解。
- 对 `object.GetHashCode()` 和 `Equals()` 的理解(用于订阅管理)。
- 可选:弱引用处理、事件聚合器设计等。

---

### ✅ 示例用法:

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

bus.Subscribe(s => Console.WriteLine("Sync handler: " + s));
bus.Subscribe(async s =>
{
await Task.Delay(100);
Console.WriteLine("Async handler: " + s);
});

bus.Publish("Hello EventBus!");
```

输出:
```
Sync handler: Hello EventBus!
Async handler: Hello EventBus!
```

---

### 💡 提示:

- 使用 `ConcurrentDictionary>` 来存储不同事件类型的处理器。
- 在 `Publish` 方法中,需深拷贝当前处理器列表以避免并发修改问题。
- 可以区分同步和异步处理器,或统一处理为 `Func`。
- 异步处理时注意是否要使用 `await`,是否需要并行执行多个异步处理器。

---

如果你需要我提供一个**参考实现**,我也可以继续为你写出完整代码。是否需要?

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

上一篇: c#题例-2025-07-20 02:51:44

下一篇: c#题例-2025-07-19 14:32:24

精华推荐