c#题例-2025-07-22 12:51:56
日期: 2025-07-22 分类: AI写作 14次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **闭包、委托、异步编程、捕获变量、线程安全** 等多个高级概念,考察候选人对 C# 语言机制的深入理解。
---
### 🧠 面试题:闭包陷阱与异步执行顺序
**题目:**
请分析以下 C# 代码,预测其输出结果,并解释原因。
```csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var tasks = new Task[5];
for (int i = 0; i < 5; i++)
{
tasks[i] = Task.Run(async () =>
{
await Task.Delay(100); // 模拟异步操作
Console.WriteLine(i);
});
}
await Task.WhenAll(tasks);
}
}
```
---
### ✅ 正确答案与解析:
**输出结果:**
```
5
5
5
5
5
```
**解释:**
1. **变量捕获(闭包)问题:**
- `i` 是一个 **局部变量**,它在 `for` 循环中被多个 `Task` 捕获。
- 由于 `Task.Run` 是异步执行的,当 `i` 被访问时,`for` 循环可能已经执行完毕,此时 `i == 5`。
- 所有任务捕获的都是 **同一个变量 `i` 的引用**,而不是值。
2. **异步延迟的影响:**
- `await Task.Delay(100)` 模拟了异步延迟,确保 `Console.WriteLine(i)` 在循环结束后才执行。
- 因此,每个任务输出的 `i` 值都是最终的 `5`。
3. **如何修复?**
- 在循环内部创建一个副本,确保每次迭代捕获的是当前值。
```csharp
for (int i = 0; i < 5; i++)
{
int local = i;
tasks[i] = Task.Run(async () =>
{
await Task.Delay(100);
Console.WriteLine(local);
});
}
```
这样输出结果将是:
```
0
1
2
3
4
```
---
### 💡 考察点总结:
| 技术点 | 是否考察 |
|------------------|----------|
| 异步编程(async/await) | ✅ |
| 闭包与变量捕获 | ✅ |
| 线程安全与变量共享 | ✅ |
| Task.Delay 与执行顺序 | ✅ |
| 值类型与引用类型行为 | ✅ |
---
如果你需要更多类似难度的题目,我可以继续提供,涵盖 LINQ 表达式树、反射、泛型约束、内存模型、unsafe 代码、协变逆变、表达式树优化等高级主题。需要吗?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐