c#题例-2025-08-07 00:18:27
日期: 2025-08-07 分类: AI写作 8次阅读
当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它融合了语言特性、面向对象设计、委托/事件机制、泛型编程、并发编程等多个高级知识点,考察候选人对 C# 的深入理解与综合运用能力:
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)
#### 📌 题目描述:
请使用 C# 实现一个轻量级的**线程安全事件总线(Event Bus)**,支持以下功能:
1. **订阅事件**:任意类型可以订阅某个事件类型(泛型)。
2. **发布事件**:发布一个事件后,所有订阅者都应该接收到。
3. **取消订阅**:支持取消某个订阅。
4. **支持异步处理**:订阅者可以以异步方式处理事件。
5. **线程安全**:支持多线程并发发布和订阅。
#### 🧩 要求:
- 使用泛型来支持多种事件类型。
- 使用 `delegate` 或 `Func<>` 或 `EventHandler<>` 来封装订阅行为。
- 事件处理应支持同步和异步(`Func
- 事件总线必须是线程安全的,防止在并发访问时出现异常。
- 提供 `Subscribe` 和 `Unsubscribe` 方法。
- 提供 `Publish` 方法用于发布事件。
- 可选:支持一次订阅只处理一次事件(One-time subscription)。
---
### 💡 示例代码结构:
```csharp
public interface IEventBus
{
IDisposable Subscribe
IDisposable SubscribeAsync
Task PublishAsync
}
public class EventBus : IEventBus
{
// 实现细节
}
```
---
### 📌 面试官考察点:
| 考察点 | 说明 |
|--------|------|
| 泛型编程 | 是否能用泛型支持多种事件类型 |
| 委托与事件 | 是否理解 `Action
| 异步编程 | 是否能处理异步事件逻辑(`async/await`) |
| 线程安全 | 是否使用 `ConcurrentDictionary`, `lock`, `Interlocked` 等机制保证线程安全 |
| IDisposable 模式 | 是否用 `IDisposable` 来优雅地取消订阅 |
| 面向对象设计 | 接口设计是否合理,是否可扩展 |
| 内存泄漏预防 | 是否避免强引用导致的对象无法释放问题(进阶) |
---
### ✅ 示例使用方式:
```csharp
var eventBus = new EventBus();
// 订阅
var subscription = eventBus.Subscribe
{
Console.WriteLine($"Received event: {e.Message}");
});
// 发布
eventBus.PublishAsync(new SampleEvent { Message = "Hello World" }).Wait();
// 取消订阅
subscription.Dispose();
```
---
如果你需要这道题的标准答案或实现示例,我也可以提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐