Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-03 02:32:02

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它考察了对 **委托、事件、闭包、线程安全、异步编程模型** 和 **设计模式** 的深入理解,同时还需要具备良好的代码组织与调试能力。

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)系统

#### 背景:
你需要为一个模块化系统(如插件架构或MVVM应用)实现一个**轻量级、线程安全的事件总线(Event Bus)**,用于模块间的解耦通信。

#### 要求:
1. 实现一个泛型的事件发布/订阅系统 `IEventBus`,支持多个订阅者监听特定类型的事件。
2. 订阅者可以通过委托(`Action`)注册。
3. 发布事件时,所有已注册的订阅者都应收到通知。
4. 保证线程安全(支持并发订阅、取消订阅和发布)。
5. 支持自动取消订阅(如对象被GC回收时自动移除)——提示:可以使用 `WeakReference`。
6. 提供一个使用示例,并展示线程安全性和自动取消订阅特性。

---

### ✅ 示例接口定义(你可以扩展):

```csharp
public interface IEventBus
{
void Subscribe(Action handler);
void Unsubscribe(Action handler);
void Publish(T @event);
}
```

---

### 💡 进阶问题(用于面试中深入探讨):

1. 你如何处理在事件发布过程中取消订阅的情况?
2. 使用 `WeakReference` 会带来哪些性能或设计上的权衡?
3. 如何扩展这个事件总线以支持多个事件类型(非泛型)?
4. 如果事件处理中抛出异常,你会如何处理?是否要继续通知其他订阅者?
5. 如何支持异步事件处理(即 `Func`)?

---

### 🧪 示例使用场景:

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

class Program
{
static void Main()
{
var bus = new EventBus();

var subscriber = new SampleSubscriber();
bus.Subscribe(subscriber.OnEventReceived);

bus.Publish(new SampleEvent { Message = "Hello World!" });

// subscriber = null; // 模拟对象被回收
// GC.Collect(); // 触发后应自动取消订阅

Console.ReadLine();
}
}

class SampleSubscriber
{
public void OnEventReceived(SampleEvent e)
{
Console.WriteLine("Received: " + e.Message);
}
}
```

---

### 📌 面试官考察点:

- 是否理解委托和事件的生命周期管理。
- 是否能处理并发场景下的线程安全问题。
- 对弱引用机制和垃圾回收的理解。
- 是否具备良好的接口设计和抽象能力。
- 是否能应对实际项目中可能出现的异常情况。

---

如果你需要这道题的参考实现或讲解,我可以继续为你提供。是否需要?

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

上一篇:无

下一篇: c#题例-2025-08-02 20:58:41

精华推荐