Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-24 22:52:10

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、闭包、线程安全** 以及 **设计模式** 的综合应用,适合考察高级开发者的综合编程能力和设计思维。

---

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

#### 背景:
在现代的 C# 应用中(如 WPF、ASP.NET Core、Unity 等),**事件总线(Event Bus)** 是一种常用的设计模式,用于解耦模块之间的通信。你需要设计并实现一个轻量级、线程安全、泛型支持的事件总线。

---

### 📌 题目要求:

请实现一个名为 `EventBus` 的类,满足以下要求:

1. 支持注册和取消注册事件处理函数(订阅者):
- 使用泛型方法,支持任意事件类型(如 `EventA`, `EventB` 等)。
- 处理函数应为 `Action` 类型。

2. 支持发布事件(通知订阅者):
- 发布时应线程安全地调用所有订阅了该事件类型的处理函数。
- 如果处理函数在执行过程中抛出异常,不应中断其他处理函数的执行。

3. 保证线程安全:
- 多线程环境下注册、取消注册、发布事件不能导致竞态条件或异常。

4. 可选加分项:
- 实现事件处理函数的优先级排序。
- 支持异步处理(返回 `Task` 的处理函数)。
- 支持弱引用以避免内存泄漏。

---

### ✅ 示例代码结构:

```csharp
public class EventBus
{
// TODO: 实现以下方法
public void Subscribe(Action handler) where T : class;
public void Unsubscribe(Action handler) where T : class;
public void Publish(T @event) where T : class;
}
```

---

### 🧪 示例使用方式:

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

// 订阅
bus.Subscribe(e => Console.WriteLine($"Received EventA: {e.Message}"));
bus.Subscribe(e => Console.WriteLine($"Received EventB: {e.Id}"));

// 发布
bus.Publish(new EventA { Message = "Hello A" });
bus.Publish(new EventB { Id = 123 });
```

```csharp
public class EventA { public string Message { get; set; } }
public class EventB { public int Id { get; set; } }
```

---

### 💡 考察点:

- 对 `EventHandler`, `Action`, `Delegate` 的理解。
- 泛型约束和反射的使用。
- 多线程并发访问的处理(如使用 `ConcurrentDictionary`, `lock`, `ReaderWriterLockSlim` 等)。
- 异常处理策略(如 try-catch 包裹每个 handler)。
- 对设计模式(观察者、发布-订阅)的理解。
- 内存管理与弱引用机制(加分项)。

---

### 🧩 可选进阶问题(用于深入讨论):

1. 如果多个线程同时发布同一个事件,如何避免重复处理?
2. 如何支持异步事件处理(即 handler 返回 `Task`)?
3. 如何实现事件的“单次订阅”?
4. 如何实现事件的优先级排序?

---

如果你需要参考实现或想看一种推荐的写法,我也可以提供一个完整的线程安全版本。是否需要?

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

上一篇: c#题例-2025-07-25 04:25:22

下一篇: c#题例-2025-07-24 17:18:41

精华推荐