c#题例-2025-07-11 03:31:48
日期: 2025-07-11 分类: AI写作 13次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、异步编程、闭包和线程安全** 等多个高级概念。这类题目适合考察候选人在复杂场景下的设计能力与语言掌握深度。
---
### 🧠 面试题:实现一个支持异步任务的缓存装饰器(Cache Decorator)
#### 💬 题目描述:
请实现一个通用的缓存装饰器类 `CachingDecorator
```csharp
public interface IAsyncCalculator
{
Task
}
```
你的目标是编写如下形式的装饰器类:
```csharp
public class CachingDecorator
{
private readonly IAsyncCalculator
private readonly ConcurrentDictionary
public CachingDecorator(IAsyncCalculator
{
_inner = inner;
_cache = new ConcurrentDictionary
}
public async Task
{
// 实现缓存逻辑
}
}
```
#### ✅ 要求功能:
1. **缓存共享同一个 key 的异步计算结果**,避免重复执行相同 key 的计算。
2. 使用 `Lazy
3. 支持 `CancellationToken`,如果某个调用被取消,不影响其他调用。
4. 如果 `_inner.CalculateAsync` 抛出异常,则缓存不应保留该失败的结果。
5. 提供一个方法来清除缓存(可选加分)。
---
### 💡 进阶问题(用于深入讨论):
- 如何为缓存添加过期机制?
- 如何使此装饰器适用于同步接口?
- 如何在 ASP.NET Core 中集成此类作为服务?
- 如何测试这个装饰器的行为?
---
### 📌 示例使用方式:
```csharp
var calculator = new RealAsyncCalculator(); // 实现了 IAsyncCalculator
var cached = new CachingDecorator
var result1 = await cached.CalculateAsync("key1", CancellationToken.None);
var result2 = await cached.CalculateAsync("key1", CancellationToken.None); // 应从缓存获取
```
---
### 🧾 参考答案(部分):
```csharp
public async Task
{
if (ct.IsCancellationRequested)
return default; // 或抛出 OperationCanceledException
var lazyTask = _cache.GetOrAdd(key, k => new Lazy
try
{
var result = await lazyTask.Value.ConfigureAwait(false);
return result;
}
catch
{
_cache.TryRemove(key, out _); // 失败则移除缓存
throw;
}
}
```
---
如果你需要我进一步解释这道题的设计思想、常见错误或如何评估候选人的回答,我可以继续补充。是否要我给出一份完整的参考实现?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐