c#题例-2025-07-08 17:31:44
日期: 2025-07-08 分类: AI写作 8次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **闭包、委托、异步编程、捕获变量(captured variables)和线程安全** 的综合理解,是考察候选人对语言底层机制掌握程度的好题目:
---
### 🧠 面试题:闭包陷阱与异步执行顺序
**题目代码如下:**
```csharp
using System;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
var tasks = new Task[10];
for (var i = 0; i < 10; i++)
{
Task task = Task.Run(() =>
{
Console.WriteLine(i);
});
tasks[i] = task;
}
Task.WaitAll(tasks);
Console.WriteLine("Done");
}
}
```
---
### ❓问题一:
这段代码预期输出从 `0` 到 `9`,但实际运行结果可能是什么?为什么会这样?
---
### ❓问题二:
如何修改上面的代码,确保输出始终是 `0` 到 `9`,每个数字各一次?
---
### ❓问题三(进阶):
如果将 `Task.Run` 替换为 `Task.Factory.StartNew` 并指定 `TaskScheduler.Default`,行为会改变吗?为什么?
---
### ❓问题四(扩展思维):
在不使用锁的前提下,如何保证多个任务访问共享资源时不会出现竞态条件(race condition)?你有哪些策略?
---
### ✅ 考察点总结:
| 技术点 | 描述 |
|--------|------|
| 闭包与变量捕获 | 是否理解循环中 lambda 表达式捕获的是变量而非值 |
| 异步编程模型 | 对 Task 和线程池调度的理解 |
| 线程安全 | 是否意识到多个线程同时读写共享变量的风险 |
| 语言特性应用 | 是否能正确使用临时局部变量或其它方式规避捕获陷阱 |
---
### 💡 提示(可作为引导提问):
- 在 C# 中,lambda 表达式捕获的是**变量本身**,而不是其**当时的值**。
- 使用一个局部变量如 `int copy = i;` 可以打破这种“共享引用”。
- 使用 `async/await` 或 `ValueTask` 是否会影响行为?
- 如何用 `ConcurrentBag
---
如果你需要更多类似难度级别的题目(比如关于泛型约束、表达式树、反射 emit、内存模型等),我也可以继续提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐