Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-10 05:18:26

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涵盖了 **委托、泛型、闭包、线程安全、异步编程**等多个高级概念,考察候选人对语言特性和多线程编程的理解深度:

---

### 🧠 面试题:实现一个线程安全的缓存装饰器(Thread-Safe Cache Decorator)

#### 背景:
你正在开发一个高性能服务,其中某些计算开销很大但输入参数相同的情况下结果不变。为了提升性能,你需要为这些方法添加缓存机制。

#### 要求:

编写一个通用的 `CacheDecorator` 类,它可以将任意无副作用的函数 `Func` 包装成一个带缓存版本的函数,满足以下条件:

1. 使用泛型支持任意键值类型。
2. 缓存必须是线程安全的(多个线程同时调用时不会重复计算)。
3. 支持缓存过期时间(TTL),每个缓存项在创建后一段时间内有效。
4. 实现懒加载更新策略(即缓存过期后,在下次请求时重新计算)。
5. 不使用任何第三方库或 `System.Runtime.Caching`。

#### 示例代码结构:

```csharp
public class CacheDecorator
{
private readonly Func _func;
private readonly TimeSpan _ttl;

// TODO: 成员变量定义

public CacheDecorator(Func func, TimeSpan ttl)
{
_func = func ?? throw new ArgumentNullException(nameof(func));
_ttl = ttl;
}

public Func GetCachedFunc()
{
return key =>
{
// TODO: 实现缓存逻辑
};
}
}
```

#### 使用示例:

```csharp
var expensiveFunc = new Func(x =>
{
Thread.Sleep(1000); // 模拟耗时操作
return x * x;
});

var cachedFunc = new CacheDecorator(expensiveFunc, TimeSpan.FromSeconds(5))
.GetCachedFunc();

Console.WriteLine(cachedFunc(5)); // 第一次慢
Console.WriteLine(cachedFunc(5)); // 第二次快
Thread.Sleep(5000);
Console.WriteLine(cachedFunc(5)); // 第三次又慢
```

---

### ✅ 考察点解析:

| 技术点 | 是否考察 |
|--------|----------|
| 委托与闭包 | ✅ |
| 泛型编程 | ✅ |
| 线程安全(并发字典、锁等) | ✅ |
| 缓存机制与 TTL 实现 | ✅ |
| 异步/同步控制 | ⚠️(视是否要求延迟刷新) |
| 性能优化意识 | ✅ |
| 代码结构设计能力 | ✅ |

---

### 💡 提示(供面试官参考):

- 推荐使用 `ConcurrentDictionary` 来存储缓存项。
- 每个缓存项应包含 `Value` 和 `Timestamp`。
- 可考虑使用 `Lazy` 来避免重复计算。
- 对于更高级的要求,可让候选人实现“后台刷新”机制,而不是阻塞等待重新计算。

---

需要我提供一份完整实现吗?或者你可以试着写一版看看 😄

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

上一篇: c#题例-2025-07-10 10:52:04

下一篇: c#题例-2025-07-09 22:32:13

精华推荐