c#题例-2025-08-08 10:51:49
日期: 2025-08-08 分类: AI写作 5次阅读
当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它涵盖了 C# 的高级特性,如委托、泛型、异步编程、表达式树以及对语言设计的理解:
---
### 🧠 **面试题:实现一个异步事件总线(Event Bus)框架核心逻辑**
#### **题目描述:**
你需要实现一个轻量级的**异步事件总线(Event Bus)**,用于在系统中发布和订阅事件。事件总线需要支持以下功能:
1. **注册事件处理器(Handler)**
通过泛型方式注册某个事件类型 `TEvent` 的处理器,处理器可以是一个 `Func
2. **取消注册事件处理器**
3. **发布事件**
发布一个事件后,所有已注册的对应处理器都应该被**异步执行**。
4. **支持事件继承匹配(可选进阶)**
如果一个处理器注册在 `BaseEvent` 上,它也应该能接收到 `DerivedEvent` 类型的事件。
#### **接口定义如下(需你实现):**
```csharp
public interface IEventBus
{
void Subscribe
void Unsubscribe
Task PublishAsync
}
```
---
### 💡 **考察点:**
1. **泛型与委托的高级使用**
2. **线程安全设计(如使用 ConcurrentDictionary)**
3. **异步编程模型(async/await)**
4. **事件类型匹配逻辑(可选进阶)**
5. **面向对象设计能力(接口抽象、解耦)**
6. **表达式树或反射的可扩展性设计(进阶)**
---
### ✅ **参考实现(核心逻辑):**
```csharp
public class EventBus : IEventBus
{
private readonly ConcurrentDictionary
public void Subscribe
{
_handlers
.GetOrAdd(typeof(TEvent), _ => new List
.Add(handler);
}
public void Unsubscribe
{
if (_handlers.TryGetValue(typeof(TEvent), out var list))
{
list.Remove(handler);
}
}
public async Task PublishAsync
{
var tasks = new List
foreach (var kvp in _handlers)
{
if (kvp.Key.IsAssignableFrom(typeof(TEvent)))
{
foreach (var handler in kvp.Value)
{
tasks.Add(((Func
}
}
}
await Task.WhenAll(tasks);
}
}
```
---
### 🔍 **可扩展问题(追问):**
1. 如何保证事件处理器的执行顺序?
2. 如何支持同步和异步混合的处理器?
3. 如何实现事件处理器的优先级?
4. 如何将这个事件总线集成到 ASP.NET Core 或其他 DI 框架中?
5. 如何实现事件的过滤、重试、日志记录等扩展功能?
---
如果你需要,我还可以提供对应的单元测试代码或进一步扩展设计图(如 UML 类图)。
是否需要我继续扩展这个实现?或者出一道涉及 LINQ 表达式树或 Roslyn 分析器的题目?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐