c#题例-2025-08-08 10:51:49
日期: 2025-08-08 分类: AI写作 99次阅读
当然可以!以下是一道**专家级别**的 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写作
精华推荐

