Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-01 23:51:47

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它考察了 **泛型、委托、闭包、递归、线程安全设计、以及函数式编程思想** 的综合理解。

---

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

#### 📌 背景说明:
你正在开发一个高性能服务,其中有一些高频率调用但计算代价高的方法。为了提升性能,你需要为这些方法构建一个通用的缓存机制。要求如下:

- 编写一个泛型 `CachedFunction` 类,用于包装一个 `Func` 委托。
- 缓存应支持任意类型 `TArg` 和 `TResult`。
- 使用 `ConcurrentDictionary` 实现线程安全。
- 支持自定义键转换器(例如对复杂对象生成唯一键)。
- 提供缓存清除功能。
- 可选加分项:支持基于时间的过期策略。

---

### ✍️ 任务要求:

1. 实现 `CachedFunction` 类,构造函数接受以下参数:
- `func`: 要被缓存的方法 `Func`
- `keySelector`: 可选的键提取函数,默认使用 `x => x`,如果是引用类型建议重写 `.GetHashCode()` 和 `.Equals()`
2. 实现 `TResult Invoke(TArg arg)` 方法,该方法返回缓存结果或调用原始函数并缓存结果。
3. 实现 `Clear()` 方法清空当前缓存。
4. 确保整个类是线程安全的。
5. 可以考虑懒加载缓存值,避免并发重复计算。

---

### 💡 示例代码框架:

```csharp
public class CachedFunction
{
private readonly Func _func;
private readonly Func _keySelector;
private readonly ConcurrentDictionary _cache;

public CachedFunction(Func func, Func keySelector = null)
{
// TODO: 实现
}

public TResult Invoke(TArg arg)
{
// TODO: 实现
}

public void Clear()
{
// TODO: 实现
}
}
```

---

### 🔍 示例用法:

```csharp
var expensiveFunc = new Func(x =>
{
Console.WriteLine($"Computing for {x}...");
return x * x;
});

var cachedFunc = new CachedFunction(expensiveFunc);

Console.WriteLine(cachedFunc.Invoke(5)); // 输出:Computing for 5... 25
Console.WriteLine(cachedFunc.Invoke(5)); // 输出:25 (不重新计算)
cachedFunc.Clear();
Console.WriteLine(cachedFunc.Invoke(5)); // 输出:Computing for 5... 25
```

---

### 🧪 进阶扩展问题(可选):

- 如何给缓存添加过期时间?
- 如果 `TResult` 是一个异步任务(如 `Task`),如何修改这个缓存?
- 如果希望在缓存未命中时异步加载,如何改进?

---

这道题不仅考验候选人对 C# 高级特性的掌握,也测试其架构思维和实际工程能力,非常适合用于高级/资深 C# 开发者的面试场景。需要我提供参考答案吗?

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

上一篇: c#题例-2025-07-02 05:25:01

下一篇: c#题例-2025-07-01 18:18:24

精华推荐