Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-06 17:31:52

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、闭包、线程安全** 和 **设计模式** 的综合理解,适合考察候选人对 C# 高级特性和底层机制的掌握。

---

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

#### 背景:
在大型系统中,常使用事件聚合器(Event Aggregator)来实现松耦合的通信机制,类似于发布/订阅模式。你需要设计一个轻量级、线程安全、泛型支持的事件聚合器。

---

### 📌 任务:

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

1. **泛型支持**:可以订阅和发布任意类型的事件消息(如 `EventA`, `EventB` 等)。
2. **线程安全**:多个线程可以同时订阅、取消订阅和发布事件。
3. **支持弱引用订阅者**(可选加分项):防止内存泄漏。
4. **高效的消息分发机制**:避免重复订阅,订阅和发布效率高。
5. **异常处理**:在事件处理过程中出现异常时,不中断其他订阅者。

---

### 📦 接口定义参考:

```csharp
public interface IHandle
{
void Handle(T message);
}

public class EventAggregator
{
public void Subscribe(IHandle handler);
public void Unsubscribe(IHandle handler);
public void Publish(T message);
}
```

---

### 💡 示例用法:

```csharp
public class MyEvent
{
public string Message { get; set; }
}

public class MyHandler : IHandle
{
public void Handle(MyEvent message)
{
Console.WriteLine(message.Message);
}
}

// 使用
var ea = new EventAggregator();
var handler = new MyHandler();

ea.Subscribe(handler);
ea.Publish(new MyEvent { Message = "Hello World" }); // 输出 Hello World
```

---

### ✅ 考察点:

| 技术点 | 说明 |
|----------------------|------|
| 泛型与接口约束 | `IHandle` 的使用与类型匹配 |
| 委托与事件处理 | 可使用 `Action` 替代接口(加分项) |
| 线程安全 | 多线程并发访问时的同步机制(如 `ConcurrentDictionary` + `ReaderWriterLockSlim`) |
| 弱引用机制 | 使用 `WeakReference` 避免内存泄漏(高级) |
| 异常处理与健壮性 | 使用 try-catch 包裹每个 handler 调用 |
| 数据结构选择 | 合理选择字典、列表、快照等结构进行事件管理 |
| 闭包与性能优化 | 避免频繁的委托创建或捕获变量问题 |

---

### 📝 提示:

- 可使用 `ConcurrentDictionary>` 存储事件处理器。
- 或者更细粒度地使用 `ConcurrentDictionary>` 实现不可变快照,避免锁。
- 可使用 `Action` 替代 `IHandle` 接口,使 API 更灵活。

---

### 🎯 延伸问题(加分):

- 如何支持异步事件处理?
- 如何实现事件优先级?
- 如何实现事件订阅超时机制?

---

如果你需要我提供一个参考实现,也可以告诉我 😄

是否需要我给出一个线程安全版本的实现代码?

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

上一篇: c#题例-2025-08-07 00:18:27

下一篇: c#题例-2025-08-06 11:58:24

精华推荐