c#题例-2025-07-29 06:31:40
日期: 2025-07-29 分类: AI写作 15次阅读
当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 **委托、泛型、闭包、线程安全、表达式树** 等多个高级概念,考察候选人对 C# 高级特性的掌握和综合运用能力。
---
### 🧠 面试题:构建一个线程安全的事件总线(Event Bus)并支持基于表达式树的条件订阅
#### 题目描述:
请实现一个名为 `ConditionalEventBus` 的类,满足以下要求:
1. 支持发布和订阅事件(事件类型为泛型 `TEvent`)。
2. 订阅时可以传入一个 `Expression
3. 只有当事件满足该条件时,订阅者才会被触发。
4. 使用 `Expression.Compile()` 编译表达式并执行条件判断。
5. 保证线程安全,支持并发订阅、取消订阅和发布事件。
6. 支持取消订阅。
7. 不允许使用 `System.Event` 或 `EventHandler`,而是使用自定义委托。
8. (加分项)优化表达式编译缓存,避免重复编译。
---
### 示例代码结构:
```csharp
public class ConditionalEventBus
{
// TODO: 实现以下方法
public void Subscribe
public void Unsubscribe
public void Publish
}
```
---
### 示例用法:
```csharp
var bus = new ConditionalEventBus();
// 订阅一个只处理数字大于10的事件
bus.Subscribe
"subscriber1",
e => e > 10,
i => Console.WriteLine($"Received: {i}")
);
bus.Publish(5); // 不应触发
bus.Publish(15); // 应该触发
bus.Unsubscribe
bus.Publish(20); // 不应触发
```
---
### 考察点:
| 考察点 | 描述 |
|--------|------|
| 泛型编程 | 使用泛型参数 `TEvent` |
| 委托与闭包 | 使用 `Action
| 表达式树 | 使用 `Expression
| 线程安全 | 多线程环境下订阅、发布、取消订阅安全 |
| 数据结构设计 | 如何存储订阅者、表达式、处理器 |
| 性能优化 | 缓存编译后的 `Func<>` 避免重复编译 |
| 面向对象设计 | 是否有良好的封装和扩展性 |
---
### 提示:
- 使用 `ConcurrentDictionary` 存储每个事件类型的订阅者。
- 每个订阅者包含 `conditionFunc` 和 `handler`。
- 编译表达式时注意泛型类型参数的匹配。
- 使用 `ReaderWriterLockSlim` 或 `lock` 来保护订阅和取消订阅操作。
---
如果你需要参考实现,我也可以提供一份完整的代码。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐