Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-03 21:31:44

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、闭包、线程安全和异步编程**等高级概念:

---

### 🧠 面试题:分析并解释以下代码的输出(涉及闭包陷阱与异步执行)

```csharp
using System;
using System.Threading.Tasks;

class Program
{
static void Main(string[] args)
{
var actions = new Action[5];

for (int i = 0; i < 5; i++)
{
Task.Delay(10).ContinueWith(_ =>
{
Console.WriteLine(i);
});
}

Console.ReadLine();
}
}
```

### ❓问题:
请问控制台最终会输出什么?为什么?

---

### ✅ 考察点:

1. **闭包与循环变量捕获陷阱(Closure over loop variable)**
2. **ContinueWith 的异步执行机制**
3. **Task.Delay 的延迟调度行为**
4. **线程安全与共享状态访问**
5. **如何避免常见的闭包陷阱**

---

### 💡 参考答案思路:

这段代码中,`i` 是在 `for` 循环外部定义的变量。每次在 `ContinueWith` 中使用的 `i` 实际上是同一个变量的引用。

由于 `Task.Delay(10)` 是异步操作,并且 `ContinueWith` 是在其完成后调度的,当这些回调真正执行时,`for` 循环早已完成,此时 `i` 的值已经是 `5`。

所以,你很可能会看到控制台输出五次 `5`。

---

### 🔍 进一步提问(可选扩展):

- 如何修改代码以确保每个 `ContinueWith` 捕获的是当前循环迭代的 `i` 值?
- 如果将 `ContinueWith` 替换为 `await Task.Delay(10); Console.WriteLine(i);`,结果会怎样?为什么?
- 使用 `lock` 或 `Interlocked` 是否能解决这个问题?如果不合适,为什么?

---

如果你需要更多类似难度的题目,我也可以提供关于 **LINQ 表达式树优化**、**自定义 awaiter 实现**、或 **C# 高级泛型约束与反射结合使用** 的题目。是否需要?

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

上一篇: c#题例-2025-07-04 04:19:02

下一篇: c#题例-2025-07-03 15:58:30

精华推荐