c#题例-2025-07-24 10:31:56
日期: 2025-07-24 分类: AI写作 21次阅读
当然可以!下面是一道**专家级别**的 **C# 逻辑面试题**,它涉及 **委托、事件、异步编程、闭包、线程安全** 和 **设计模式** 的综合理解,适合考察高级 C# 程序员的综合能力。
---
### 🧠 面试题:实现一个线程安全的事件发布/订阅系统(Event Aggregator)
#### 背景:
你正在开发一个大型的 WPF 或 .NET Core 应用程序,需要实现一个全局的 **事件聚合器(Event Aggregator)**,用于在松耦合的组件之间进行通信。
#### 任务:
请使用 C# 实现一个线程安全的 `IEventAggregator` 接口,并满足以下要求:
```csharp
public interface IEventAggregator
{
// 订阅一个事件,action 是事件触发时执行的回调
IDisposable Subscribe
// 发布一个事件,将消息发送给所有订阅者
void Publish
}
```
---
### 🧩 具体要求:
1. **线程安全:**
- 多个线程可以同时调用 `Publish` 和 `Subscribe`。
- 确保订阅者在订阅和发布期间不会被并发修改(如 `ConcurrentModificationException`)。
2. **资源管理:**
- `Subscribe` 返回一个 `IDisposable`,用于取消订阅。
- 当调用 `Dispose()` 时,应安全地从订阅列表中移除对应的回调。
3. **性能与内存管理:**
- 使用弱引用(Weak Reference)防止内存泄漏(进阶要求)。
- 或者使用 `IDisposable` 正确释放资源。
4. **事件类型隔离:**
- 不同类型的事件(如 `MessageA`, `MessageB`)之间互不影响。
5. **可扩展性:**
- 支持未来扩展(例如支持异步订阅、过滤订阅等)。
---
### 💡 提示:
- 使用 `ConcurrentDictionary` 或 `lock` 机制来保证线程安全。
- 可以考虑使用 `EventHandler
- 可以使用 `WeakReference` 或 `ConditionalWeakTable` 来实现弱订阅(进阶)。
- 考虑使用 `ToList()` 在发布时拷贝订阅者列表,避免在遍历时修改集合。
---
### 🧪 示例代码:
```csharp
var eventAggregator = new EventAggregator();
// 订阅
var subscription = eventAggregator.Subscribe
// 发布
eventAggregator.Publish("Hello World");
// 取消订阅
subscription.Dispose();
```
---
### 🧪 额外加分点(进阶):
- 实现支持异步回调:`SubscribeAsync
- 实现事件过滤:`Subscribe
- 实现事件优先级(有序执行)
---
### ✅ 评估标准:
| 能力项 | 考察点 |
|--------|--------|
| 基础语法 | 泛型、委托、接口使用 |
| 线程安全 | 是否处理并发访问 |
| 资源管理 | 是否正确实现 `IDisposable` |
| 内存管理 | 是否避免内存泄漏 |
| 架构思维 | 是否具备设计可扩展系统的能力 |
---
如果你需要参考实现或想看看一个优秀答案,我也可以提供一份完整代码。需要吗?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐