Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-11 03:31:48

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、异步编程、闭包和线程安全** 等多个高级概念。这类题目适合考察候选人在复杂场景下的设计能力与语言掌握深度。

---

### 🧠 面试题:实现一个支持异步任务的缓存装饰器(Cache Decorator)

#### 💬 题目描述:

请实现一个通用的缓存装饰器类 `CachingDecorator`,它能够将任意实现了 `IAsyncCalculator` 接口的对象进行包装,并缓存其异步计算结果。具体要求如下:

```csharp
public interface IAsyncCalculator
{
Task CalculateAsync(string key, CancellationToken ct);
}
```

你的目标是编写如下形式的装饰器类:

```csharp
public class CachingDecorator : IAsyncCalculator
{
private readonly IAsyncCalculator _inner;
private readonly ConcurrentDictionary>> _cache;

public CachingDecorator(IAsyncCalculator inner)
{
_inner = inner;
_cache = new ConcurrentDictionary>>();
}

public async Task CalculateAsync(string key, CancellationToken ct)
{
// 实现缓存逻辑
}
}
```

#### ✅ 要求功能:

1. **缓存共享同一个 key 的异步计算结果**,避免重复执行相同 key 的计算。
2. 使用 `Lazy>` 来确保即使在并发请求下也只执行一次实际计算。
3. 支持 `CancellationToken`,如果某个调用被取消,不影响其他调用。
4. 如果 `_inner.CalculateAsync` 抛出异常,则缓存不应保留该失败的结果。
5. 提供一个方法来清除缓存(可选加分)。

---

### 💡 进阶问题(用于深入讨论):

- 如何为缓存添加过期机制?
- 如何使此装饰器适用于同步接口?
- 如何在 ASP.NET Core 中集成此类作为服务?
- 如何测试这个装饰器的行为?

---

### 📌 示例使用方式:

```csharp
var calculator = new RealAsyncCalculator(); // 实现了 IAsyncCalculator
var cached = new CachingDecorator(calculator);

var result1 = await cached.CalculateAsync("key1", CancellationToken.None);
var result2 = await cached.CalculateAsync("key1", CancellationToken.None); // 应从缓存获取
```

---

### 🧾 参考答案(部分):

```csharp
public async Task CalculateAsync(string key, CancellationToken ct)
{
if (ct.IsCancellationRequested)
return default; // 或抛出 OperationCanceledException

var lazyTask = _cache.GetOrAdd(key, k => new Lazy>(() => _inner.CalculateAsync(k, ct)));

try
{
var result = await lazyTask.Value.ConfigureAwait(false);
return result;
}
catch
{
_cache.TryRemove(key, out _); // 失败则移除缓存
throw;
}
}
```

---

如果你需要我进一步解释这道题的设计思想、常见错误或如何评估候选人的回答,我可以继续补充。是否要我给出一份完整的参考实现?

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

上一篇:无

下一篇: c#题例-2025-07-10 21:58:30

精华推荐