Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-23 21:52:35

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及到 **委托、事件、闭包、线程安全与异步编程** 的综合理解:

---

### 🧠 面试题:深入理解委托、闭包与线程安全

#### 背景代码:
```csharp
using System;
using System.Threading.Tasks;

public class EventPublisher
{
public event EventHandler OnUpdate;

public void TriggerEvent()
{
for (int i = 0; i < 5; i++)
{
int counter = i;
Task.Run(() =>
{
OnUpdate?.Invoke(this, EventArgs.Empty);
Console.WriteLine($"Counter value in async: {counter}");
});
}
}
}

class Program
{
static void Handler1(object sender, EventArgs args)
{
Console.WriteLine("Handler1 called");
}

static void Handler2(object sender, EventArgs args)
{
Console.WriteLine("Handler2 called");
}

static async Task Main(string[] args)
{
var publisher = new EventPublisher();

publisher.OnUpdate += Handler1;
publisher.OnUpdate += Handler2;

publisher.TriggerEvent();

await Task.Delay(1000); // Wait for async tasks to complete
}
}
```

---

### ❓ 面试问题:

1. **这段代码输出是什么?为什么?**
2. **是否存在线程安全问题?如果存在,具体在哪里?**
3. **如何确保 `OnUpdate` 事件在多线程环境下是线程安全的?请写出改进方案。**
4. **`counter` 变量是在哪里定义的?它的值是否会被正确捕获?解释闭包(Closure)在这里的作用。**
5. **如果你要将 `EventHandler` 替换为 `Func` 来支持异步事件处理,你会如何重构这个类?**

---

### ✅ 考察点解析:

| 技术点 | 解释 |
|-------------------------|------|
| 委托和事件机制 | 对 `event` 和 `EventHandler` 的使用及调用方式的理解 |
| 闭包与变量捕获 | 对 `counter = i` 的作用及 lambda 表达式中变量生命周期的理解 |
| 多线程与线程安全 | 是否意识到 `OnUpdate?.Invoke(...)` 在多个线程并发执行时可能引发的问题 |
| 异步事件模型设计 | 是否能设计支持异步处理的事件系统(如使用 `async/await`) |
| C# 最佳实践 | 如何避免竞态条件、空引用异常、事件订阅泄漏等问题 |

---

### 💡 示例答案提示(供参考):

#### 回答 1:输出内容
- 输出顺序不确定,因为是异步执行。
- 每次触发事件会打印 `"Handler1 called"` 和 `"Handler2 called"`。
- `counter` 值是固定的,因为使用了 `int counter = i` 来避免闭包陷阱。

#### 回答 2:线程安全问题
- 是的,`OnUpdate?.Invoke(...)` 不是线程安全的。当多个线程同时触发事件且有人动态增删事件订阅时,可能会抛出异常。
- 推荐写法:
```csharp
var handler = OnUpdate;
if (handler != null)
handler(this, EventArgs.Empty);
```

#### 回答 3:异步事件模型重构示例
```csharp
public async Task RaiseEventsAsync()
{
foreach (var handler in OnUpdate.GetInvocationList())
{
await ((Func)handler)(this, EventArgs.Empty);
}
}
```

---

如果你想继续深入探讨类似题目(比如结合 `Expression Trees`、`IL Emit` 或者 `Source Generator`),我也可以提供更高级别的题目。需要吗?

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

上一篇: c#题例-2025-06-24 04:38:39

下一篇: c#题例-2025-06-23 16:19:26

精华推荐