Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-07 00:18:27

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它融合了语言特性、面向对象设计、委托/事件机制、泛型编程、并发编程等多个高级知识点,考察候选人对 C# 的深入理解与综合运用能力:

---

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

#### 📌 题目描述:

请使用 C# 实现一个轻量级的**线程安全事件总线(Event Bus)**,支持以下功能:

1. **订阅事件**:任意类型可以订阅某个事件类型(泛型)。
2. **发布事件**:发布一个事件后,所有订阅者都应该接收到。
3. **取消订阅**:支持取消某个订阅。
4. **支持异步处理**:订阅者可以以异步方式处理事件。
5. **线程安全**:支持多线程并发发布和订阅。

#### 🧩 要求:

- 使用泛型来支持多种事件类型。
- 使用 `delegate` 或 `Func<>` 或 `EventHandler<>` 来封装订阅行为。
- 事件处理应支持同步和异步(`Func` 或 `Action`)。
- 事件总线必须是线程安全的,防止在并发访问时出现异常。
- 提供 `Subscribe` 和 `Unsubscribe` 方法。
- 提供 `Publish` 方法用于发布事件。
- 可选:支持一次订阅只处理一次事件(One-time subscription)。

---

### 💡 示例代码结构:

```csharp
public interface IEventBus
{
IDisposable Subscribe(Action handler);
IDisposable SubscribeAsync(Func handler);
Task PublishAsync(TEvent @event);
}

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

---

### 📌 面试官考察点:

| 考察点 | 说明 |
|--------|------|
| 泛型编程 | 是否能用泛型支持多种事件类型 |
| 委托与事件 | 是否理解 `Action` 和 `Func` 的区别 |
| 异步编程 | 是否能处理异步事件逻辑(`async/await`) |
| 线程安全 | 是否使用 `ConcurrentDictionary`, `lock`, `Interlocked` 等机制保证线程安全 |
| IDisposable 模式 | 是否用 `IDisposable` 来优雅地取消订阅 |
| 面向对象设计 | 接口设计是否合理,是否可扩展 |
| 内存泄漏预防 | 是否避免强引用导致的对象无法释放问题(进阶) |

---

### ✅ 示例使用方式:

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

// 订阅
var subscription = eventBus.Subscribe(e =>
{
Console.WriteLine($"Received event: {e.Message}");
});

// 发布
eventBus.PublishAsync(new SampleEvent { Message = "Hello World" }).Wait();

// 取消订阅
subscription.Dispose();
```

---

如果你需要这道题的标准答案或实现示例,我也可以提供。是否需要?

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

上一篇: c#题例-2025-08-07 05:51:56

下一篇: c#题例-2025-08-06 17:31:52

精华推荐