Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-19 08:58:55

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它融合了对语言特性、面向对象设计、委托/事件、泛型、异步编程等多方面的理解,适合考察候选人综合编程能力和设计思维。

---

### 🧠 面试题:实现一个可扩展的“事件总线”(Event Bus)

#### 背景:

在现代应用程序中,尤其是解耦架构(如 MVVM、CQRS、Event-Driven 架构)中,**事件总线(Event Bus)** 是一个非常重要的组件。它允许发布/订阅模式,使得组件之间可以松耦合地通信。

---

### 📌 题目描述:

请你使用 C# 实现一个简单的 **泛型事件总线(Generic Event Bus)**,满足以下要求:

---

### ✅ 功能要求:

1. 支持订阅某个事件类型 `TEvent`。
2. 支持发布事件 `TEvent`,并通知所有订阅者。
3. 支持同步和异步处理事件(订阅者可以注册为同步或异步方法)。
4. 支持取消订阅。
5. 使用泛型支持多种事件类型。
6. 保证线程安全。

---

### 💡 扩展加分项(面试官可选):

- 支持事件处理器优先级(Ordering)。
- 支持事件继承(例如订阅 `EventArgs` 可以接收所有子类型事件)。
- 支持单次订阅(Once)。
- 支持异常处理策略(如忽略、抛出、记录等)。
- 使用 `Expression Trees` 或 AOP 实现事件拦截器(Interceptor)。

---

### 🧩 示例代码结构(接口和类):

```csharp
public interface IEventBus
{
void Subscribe(Action handler) where TEvent : class;
void SubscribeAsync(Func handler) where TEvent : class;
void Unsubscribe(Action handler) where TEvent : class;
void UnsubscribeAsync(Func handler) where TEvent : class;

void Publish(TEvent @event) where TEvent : class;
Task PublishAsync(TEvent @event, CancellationToken ct = default) where TEvent : class;
}
```

---

### 🛠 示例使用场景:

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

// 同步订阅
eventBus.Subscribe(e => Console.WriteLine($"User {_e.Username} logged in"));

// 异步订阅
eventBus.SubscribeAsync(async e =>
{
await SendEmail(e.OrderId);
await LogOrder(e.OrderId);
});

// 发布事件
eventBus.Publish(new LoginEvent { Username = "Alice" });

// 异步发布
await eventBus.PublishAsync(new OrderCreatedEvent { OrderId = 123 });
```

---

### 🧪 面试官考察点:

- 对 C# 委托与事件机制的掌握(Action、Func、Task 等)
- 泛型与类型安全设计
- 线程安全与并发控制(如使用 ConcurrentDictionary)
- 异步编程模型(async/await)
- 面向对象设计能力(接口抽象、实现解耦)
- 扩展性与可维护性设计(是否预留扩展点)

---

### 🧾 参考实现提示:

- 使用 `ConcurrentDictionary>` 来存储事件处理器。
- 区分同步和异步处理器。
- 在 `Publish` 方法中遍历并调用所有订阅者。
- 使用锁或并发集合保证线程安全。
- 异步方法中使用 `Task.Run` 或直接调用 `Func`。

---

如果你需要我提供参考实现代码,也可以告诉我 😄

---

是否需要我提供一个完整参考实现?

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

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

下一篇: c#题例-2025-07-19 03:25:44

精华推荐