Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-07 22:31:54

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、闭包、线程安全、异步编程** 和 **设计模式** 的综合应用,考察候选人的语言深度和系统设计能力:

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)并支持异步订阅

#### 📌 背景:
在现代的 C# 应用程序中,事件总线(Event Bus)是一个非常常见的组件,用于解耦模块之间的通信。你需要实现一个简单的事件总线,支持以下功能:

---

### ✅ 要求功能:

1. **事件订阅**:
- 任意类型都可以订阅某个事件类型。
- 支持同步和异步处理事件。
- 一个订阅者可以注册多个事件处理器。

2. **事件发布**:
- 发布事件后,所有匹配的订阅者都应该被通知。
- 支持同步发布和异步发布。

3. **线程安全**:
- 支持多线程环境下的订阅与发布。
- 订阅与发布操作应避免竞争条件。

4. **自动取消订阅**(进阶):
- 当订阅者对象被垃圾回收时,应自动从事件总线中移除其注册的处理器(提示:使用 `WeakReference`)。

5. **支持事件继承**(进阶):
- 如果发布了一个子类事件,订阅了父类事件的处理器也应被触发。

---

### 📦 示例接口定义(可自定义):

```csharp
public interface IEventBus
{
void Subscribe(object subscriber, Action handler) where T : class;
void SubscribeAsync(object subscriber, Func handler) where T : class;

void Unsubscribe(object subscriber);
void Unsubscribe(object subscriber);

void Publish(T @event) where T : class;
Task PublishAsync(T @event) where T : class;
}
```

---

### 🧪 示例使用场景:

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

public class MyEventHandler
{
public void Handle(MyEvent e)
{
Console.WriteLine($"Sync Handler: {e.Message}");
}

public async Task HandleAsync(MyEvent e)
{
await Task.Delay(100);
Console.WriteLine($"Async Handler: {e.Message}");
}
}

// 使用示例
var bus = new EventBus();
var handler = new MyEventHandler();

bus.Subscribe(handler, handler.Handle);
bus.SubscribeAsync(handler, handler.HandleAsync);

bus.Publish(new MyEvent { Message = "Hello World" });
await bus.PublishAsync(new MyEvent { Message = "Hello Async World" });
```

---

### 🧩 考察点:

- 对 `Action`、`Func`、委托和闭包的理解。
- 对 `WeakReference` 和垃圾回收机制的掌握。
- 线程安全设计(如使用 `ConcurrentDictionary`、锁机制等)。
- 异步编程模型(async/await)的正确使用。
- 对事件继承和泛型协变的支持(使用 `is assignable from`)。
- 对面向对象设计原则的理解(如开闭原则、单一职责)。
- 性能优化意识(如避免频繁的锁、缓存事件类型等)。

---

### 💡 提示(可选提供):

- 使用 `ConcurrentDictionary>` 来保存事件处理器。
- 每个 `HandlerWrapper` 可以封装订阅者对象(使用 `WeakReference`)和实际的处理逻辑。
- 在发布事件时,遍历所有匹配的事件类型(包括基类)。
- 异步处理器应并行执行,并使用 `Task.WhenAll` 等进行聚合。

---

如果你需要参考实现或想看标准答案,我可以提供一个完整的代码示例。是否需要?

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

上一篇:无

下一篇: c#题例-2025-08-07 16:58:28

精华推荐