Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-24 10:31:56

当然可以!下面是一道**专家级别**的 **C# 逻辑面试题**,它涉及 **委托、事件、异步编程、闭包、线程安全** 和 **设计模式** 的综合理解,适合考察高级 C# 程序员的综合能力。

---

### 🧠 面试题:实现一个线程安全的事件发布/订阅系统(Event Aggregator)

#### 背景:
你正在开发一个大型的 WPF 或 .NET Core 应用程序,需要实现一个全局的 **事件聚合器(Event Aggregator)**,用于在松耦合的组件之间进行通信。

#### 任务:
请使用 C# 实现一个线程安全的 `IEventAggregator` 接口,并满足以下要求:

```csharp
public interface IEventAggregator
{
// 订阅一个事件,action 是事件触发时执行的回调
IDisposable Subscribe(Action action);

// 发布一个事件,将消息发送给所有订阅者
void Publish(T message);
}
```

---

### 🧩 具体要求:

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(msg => Console.WriteLine("Received: " + msg));

// 发布
eventAggregator.Publish("Hello World");

// 取消订阅
subscription.Dispose();
```

---

### 🧪 额外加分点(进阶):

- 实现支持异步回调:`SubscribeAsync(Func handler)`
- 实现事件过滤:`Subscribe(Action handler, Predicate filter)`
- 实现事件优先级(有序执行)

---

### ✅ 评估标准:

| 能力项 | 考察点 |
|--------|--------|
| 基础语法 | 泛型、委托、接口使用 |
| 线程安全 | 是否处理并发访问 |
| 资源管理 | 是否正确实现 `IDisposable` |
| 内存管理 | 是否避免内存泄漏 |
| 架构思维 | 是否具备设计可扩展系统的能力 |

---

如果你需要参考实现或想看看一个优秀答案,我也可以提供一份完整代码。需要吗?

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

上一篇: c#题例-2025-07-24 17:18:41

下一篇: c#题例-2025-07-24 04:58:25

精华推荐