c#题例-2025-07-09 11:25:20
日期: 2025-07-09 分类: AI写作 14次阅读
当然可以!下面是一道**专家级别**的 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
{
// ...
}
public static void Unsubscribe
{
// ...
}
public static Task PublishAsync
{
// ...
}
}
```
---
### 💡 高级考察点:
| 技术点 | 考察内容 |
|--------|-----------|
| 泛型与约束 | 使用 `where T : IEvent` 实现类型安全 |
| 委托与事件机制 | 理解 `Action
| 线程安全 | 多线程下注册/注销/发布事件时的数据一致性 |
| 弱引用 | 防止内存泄漏,考虑使用 `WeakReference` 或封装方式 |
| 异步编程 | `Task` 的合理使用,如并发执行订阅者 |
| 表达式树(加分项) | 对 lambda 表达式做唯一标识用于取消订阅 |
---
### ✅ 加分项:
- 使用 `ConcurrentDictionary` 或 `ReaderWriterLockSlim` 来提升并发性能。
- 使用 `Expression
- 使用 `IProgress
- 实现事件优先级或过滤机制(进阶扩展)。
---
如果你需要我提供参考答案或者解析,请告诉我!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐