Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-09 11:25:20

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、闭包、异步编程模型(TPL)和线程安全**等多个高级概念:

---

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

#### 背景:
你正在为一个多线程应用程序设计一个**全局事件总线(Event Bus)**,它允许组件之间通过发布/订阅模式进行通信。你需要编写一个 `EventBus` 类,支持以下功能:

- 订阅某个类型的事件。
- 取消订阅。
- 发布事件,并通知所有已订阅的监听者。

#### 要求如下:

1. 使用泛型支持多种事件类型(例如:`EventA`, `EventB`)。
2. 每个事件的订阅者是一个 `Action` 委托。
3. 确保线程安全(多个线程可能同时发布或订阅)。
4. 支持异步处理事件(即订阅者可异步执行)。
5. 防止内存泄漏(避免强引用导致无法释放对象)。
6. 提供取消订阅的功能,即使订阅使用了匿名函数或lambda表达式。

---

### 示例代码结构(你可以补充完整):

```csharp
public interface IEvent { }

public class EventA : IEvent
{
public string Message { get; set; }
}

public class EventB : IEvent
{
public int Value { get; set; }
}

public static class EventBus
{
// TODO: 实现 Subscribe, Unsubscribe 和 Publish 方法

public static void Subscribe(Action handler) where T : IEvent
{
// ...
}

public static void Unsubscribe(Action handler) where T : IEvent
{
// ...
}

public static Task PublishAsync(T @event) where T : IEvent
{
// ...
}
}
```

---

### 💡 高级考察点:

| 技术点 | 考察内容 |
|--------|-----------|
| 泛型与约束 | 使用 `where T : IEvent` 实现类型安全 |
| 委托与事件机制 | 理解 `Action` 的使用和生命周期管理 |
| 线程安全 | 多线程下注册/注销/发布事件时的数据一致性 |
| 弱引用 | 防止内存泄漏,考虑使用 `WeakReference` 或封装方式 |
| 异步编程 | `Task` 的合理使用,如并发执行订阅者 |
| 表达式树(加分项) | 对 lambda 表达式做唯一标识用于取消订阅 |

---

### ✅ 加分项:

- 使用 `ConcurrentDictionary` 或 `ReaderWriterLockSlim` 来提升并发性能。
- 使用 `Expression>` 来支持基于 Lambda 的取消订阅。
- 使用 `IProgress` 或自定义上下文传递状态。
- 实现事件优先级或过滤机制(进阶扩展)。

---

如果你需要我提供参考答案或者解析,请告诉我!

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

上一篇: c#题例-2025-07-09 16:58:48

下一篇: c#题例-2025-07-09 05:52:05

精华推荐