c#题例-2025-08-03 02:32:02
日期: 2025-08-03 分类: AI写作 8次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它考察了对 **委托、事件、闭包、线程安全、异步编程模型** 和 **设计模式** 的深入理解,同时还需要具备良好的代码组织与调试能力。
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)系统
#### 背景:
你需要为一个模块化系统(如插件架构或MVVM应用)实现一个**轻量级、线程安全的事件总线(Event Bus)**,用于模块间的解耦通信。
#### 要求:
1. 实现一个泛型的事件发布/订阅系统 `IEventBus
2. 订阅者可以通过委托(`Action
3. 发布事件时,所有已注册的订阅者都应收到通知。
4. 保证线程安全(支持并发订阅、取消订阅和发布)。
5. 支持自动取消订阅(如对象被GC回收时自动移除)——提示:可以使用 `WeakReference`。
6. 提供一个使用示例,并展示线程安全性和自动取消订阅特性。
---
### ✅ 示例接口定义(你可以扩展):
```csharp
public interface IEventBus
{
void Subscribe(Action
void Unsubscribe(Action
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
标签:AI写作
上一篇:无
精华推荐