c#题例-2025-06-24 04:38:39
日期: 2025-06-24 分类: AI写作 9次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,它结合了 **委托、泛型、异步编程、闭包捕获机制** 和 **线程安全意识**,非常适合考察高级 C# 开发者的综合能力。
---
### 🧠 面试题:异步委托与闭包陷阱
#### 背景代码:
```csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var tasks = new List
for (int i = 0; i < 5; i++)
{
int counter = i;
Task task = Task.Run(async () =>
{
await SomeOperation(counter);
Console.WriteLine($"Task {counter} completed.");
});
tasks.Add(task);
}
await Task.WhenAll(tasks.ToArray());
}
static async Task SomeOperation(int id)
{
await Task.Delay(100); // 模拟异步操作
}
}
```
---
### ❓问题一(基础理解):
**这段代码输出的结果是什么?是否存在潜在的问题?为什么?**
---
### ❓问题二(进阶):
如果我们将 `int counter = i;` 去掉,直接使用 `i`,如下所示:
```csharp
for (int i = 0; i < 5; i++)
{
Task task = Task.Run(async () =>
{
await SomeOperation(i);
Console.WriteLine($"Task {i} completed.");
});
tasks.Add(task);
}
```
**此时输出会变成什么?为什么会这样?这是哪种类型的语言特性导致的?如何修复?**
---
### ❓问题三(专家级):
假设你希望在每次循环中创建一个带有状态的委托,并且这个状态要被多个异步任务共享但又不互相干扰。你会如何设计一个通用的封装结构来实现这一点?
例如:
- 每个任务都有自己的状态副本;
- 多个任务之间不会因为闭包引用而造成数据竞争或共享错误;
- 使用 `Func
请写出一个通用的方法或类模板来解决这个问题。
---
### ❓问题四(扩展):
如果你将上面的异步操作改为使用 `Parallel.For` 并行执行同步方法,而不是使用 `Task.Run`,会出现哪些不同?为什么?这揭示了 C# 中哪两种并发模型之间的差异?
---
### ✅ 考察点总结:
| 技术点 | 是否考察 |
|--------|----------|
| 异步编程 (`async/await`) | ✅ |
| 闭包与变量捕获 | ✅ |
| 线程安全与变量生命周期 | ✅ |
| 委托与 lambda 表达式 | ✅ |
| 泛型与封装设计 | ✅ |
| 并发模型理解(TPL vs PLINQ / Parallel) | ✅ |
---
如果你需要我提供参考答案或解析,请告诉我 😊
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐