Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-29 13:18:46

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 C# 的语言特性、委托/事件、泛型、异步编程和一些设计模式思想,考察候选人的综合理解能力。

---

### 🧠 面试题:实现一个线程安全的事件聚合器(Event Aggregator)

#### 背景:
事件聚合器(Event Aggregator)是一种用于解耦发布者和订阅者的设计模式,常用于 MVVM、插件系统或大型解耦系统中。你需要实现一个轻量级的线程安全版本。

---

### ✅ 题目要求:

请使用 C# 实现一个名为 `EventAggregator` 的类,满足以下要求:

1. 支持泛型事件消息类型(如 `EventA`, `EventB`)。
2. 提供一个 `Subscribe(Action handler)` 方法,用于订阅某个事件类型。
3. 提供一个 `Publish(T message)` 方法,用于发布一个事件,通知所有订阅者。
4. 保证线程安全(多线程下订阅、发布、取消订阅都不应出错)。
5. 支持取消订阅(提供 `Unsubscribe(Action handler)` 方法)。
6. 【进阶】支持异步订阅(即订阅者可以是 `Func` 类型)。

---

### 💡 示例代码结构(供参考):

```csharp
public interface IEventAggregator
{
void Subscribe(Action handler);
void Unsubscribe(Action handler);
void Publish(T message);

// 可选
Task SubscribeAsync(Func handler);
Task PublishAsync(T message);
}

public class EventAggregator : IEventAggregator
{
// 实现细节
}
```

---

### 🧪 示例使用方式:

```csharp
var ea = new EventAggregator();

// 订阅
ea.Subscribe(msg => Console.WriteLine("Received: " + msg));

// 发布
ea.Publish("Hello World!");

// 取消订阅
Action handler = msg => Console.WriteLine("Received: " + msg);
ea.Subscribe(handler);
ea.Unsubscribe(handler);
```

---

### 🧩 考察点:

- 泛型与委托的使用
- 线程安全(并发集合如 `ConcurrentDictionary`、锁机制)
- 事件注册/注销机制
- 异步编程(`Func` 和 `Task.Run` 的使用)
- 面向对象设计与封装
- 内存泄漏防范(如弱引用处理)

---

### 🧠 进阶问题(可选追问):

1. 如何避免内存泄漏?如果订阅者是一个类的实例方法,如何防止其无法被 GC 回收?
2. 如果希望事件处理是有序的,如何扩展这个设计?
3. 如果希望事件处理是优先级驱动的,你如何修改这个结构?
4. 如何支持一次性订阅?(订阅后只执行一次)

---

如果你需要这道题的标准答案或实现参考代码,我也可以提供。是否需要?

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

上一篇: c#题例-2025-07-29 18:52:11

下一篇: c#题例-2025-07-29 06:31:40

精华推荐