Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-20 13:58:29

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、闭包、异步编程、线程安全** 和 **设计模式** 的综合运用,适合考察候选人的高级语言特性和系统设计能力。

---

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

#### 题目描述:

请使用 C# 实现一个 **线程安全的事件总线(Thread-Safe EventBus)**,支持以下功能:

1. **订阅事件(Subscribe)**
- 支持注册一个事件处理器(`Action`)来处理指定类型 `T` 的事件。
- 返回一个 `IDisposable` 对象,用于取消订阅。

2. **发布事件(Publish)**
- 支持发布一个事件对象 `T`,通知所有订阅了该事件类型的处理器。

3. **异步事件处理(可选)**
- 支持异步处理事件(即 `Func`)。

4. **支持事件继承(可选)**
- 如果事件类型是某个类型的子类,也能触发父类的订阅者(例如:`EventB` 继承 `EventA`,订阅 `EventA` 的处理器也能接收到 `EventB`)。

5. **线程安全**
- 多线程环境下能安全地订阅、取消订阅和发布事件。

---

### ✅ 示例代码结构(接口定义):

```csharp
public interface IEventBus : IDisposable
{
IDisposable Subscribe(Action handler) where T : class;
IDisposable SubscribeAsync(Func handler) where T : class;
Task PublishAsync(T @event) where T : class;
void Publish(T @event) where T : class;
}
```

---

### 💡 考察点:

| 考点 | 说明 |
|------|------|
| 委托与泛型 | 能正确使用 `Action`、`Func` 和泛型约束 |
| 闭包与线程安全 | 使用合适的锁(如 `ReaderWriterLockSlim` 或 `ConcurrentDictionary`)保证并发安全 |
| IDisposable 实现 | 正确管理订阅生命周期 |
| 异步编程 | 使用 `Task` 和 `await` 正确分发异步事件 |
| 事件继承机制(高级) | 使用反射或类型匹配实现事件继承传播 |
| 性能优化 | 如避免在发布事件时频繁加锁,使用快照或不可变集合等优化策略 |

---

### 🧪 示例使用:

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

eventBus.Subscribe(e => Console.WriteLine($"User logged in: {e.Username}"));
eventBus.SubscribeAsync(async e => await LogAsync(e.Username));

eventBus.Publish(new LoginEvent { Username = "Alice" });
await eventBus.PublishAsync(new LogoutEvent { Username = "Alice" });
```

---

### 📌 提示:

- 可以用 `ConcurrentDictionary>` 来保存事件处理器。
- 注意在发布事件时避免 `ConcurrentModificationException`。
- 可以使用 `ImmutableList` 或者快照机制来提高并发性能。
- 对于事件继承,可以使用 `Type.IsAssignableFrom()` 判断事件类型匹配。

---

如果你需要我提供一份参考实现,请告诉我!

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

上一篇: c#题例-2025-07-20 19:31:47

下一篇: c#题例-2025-07-20 08:25:09

精华推荐