c#题例-2025-07-29 13:18:46
日期: 2025-07-29 分类: AI写作 16次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 C# 的语言特性、委托/事件、泛型、异步编程和一些设计模式思想,考察候选人的综合理解能力。
---
### 🧠 面试题:实现一个线程安全的事件聚合器(Event Aggregator)
#### 背景:
事件聚合器(Event Aggregator)是一种用于解耦发布者和订阅者的设计模式,常用于 MVVM、插件系统或大型解耦系统中。你需要实现一个轻量级的线程安全版本。
---
### ✅ 题目要求:
请使用 C# 实现一个名为 `EventAggregator` 的类,满足以下要求:
1. 支持泛型事件消息类型(如 `EventA`, `EventB`)。
2. 提供一个 `Subscribe
3. 提供一个 `Publish
4. 保证线程安全(多线程下订阅、发布、取消订阅都不应出错)。
5. 支持取消订阅(提供 `Unsubscribe
6. 【进阶】支持异步订阅(即订阅者可以是 `Func
---
### 💡 示例代码结构(供参考):
```csharp
public interface IEventAggregator
{
void Subscribe
void Unsubscribe
void Publish
// 可选
Task SubscribeAsync
Task PublishAsync
}
public class EventAggregator : IEventAggregator
{
// 实现细节
}
```
---
### 🧪 示例使用方式:
```csharp
var ea = new EventAggregator();
// 订阅
ea.Subscribe
// 发布
ea.Publish("Hello World!");
// 取消订阅
Action
ea.Subscribe(handler);
ea.Unsubscribe(handler);
```
---
### 🧩 考察点:
- 泛型与委托的使用
- 线程安全(并发集合如 `ConcurrentDictionary`、锁机制)
- 事件注册/注销机制
- 异步编程(`Func
- 面向对象设计与封装
- 内存泄漏防范(如弱引用处理)
---
### 🧠 进阶问题(可选追问):
1. 如何避免内存泄漏?如果订阅者是一个类的实例方法,如何防止其无法被 GC 回收?
2. 如果希望事件处理是有序的,如何扩展这个设计?
3. 如果希望事件处理是优先级驱动的,你如何修改这个结构?
4. 如何支持一次性订阅?(订阅后只执行一次)
---
如果你需要这道题的标准答案或实现参考代码,我也可以提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐