c#题例-2025-07-23 23:25:12
日期: 2025-07-23 分类: AI写作 18次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **泛型、委托、闭包、线程安全、表达式树(Expression Trees)** 以及 **设计模式的理解**,适合考察高级开发者的综合能力。
---
### 🧠 面试题:实现一个线程安全的缓存工厂(Thread-Safe Cache Factory)
#### 📌 题目描述:
你需要实现一个通用的缓存工厂 `ICacheFactory`,它可以根据传入的键和值类型动态生成缓存实例 `ICache
要求如下:
1. `ICacheFactory` 接口定义如下:
```csharp
public interface ICacheFactory
{
ICache
}
```
2. `ICache
```csharp
public interface ICache
{
TValue Get(TKey key, Func
}
```
3. 当调用 `Get` 方法时:
- 如果缓存中存在未过期的值,则直接返回。
- 如果缓存不存在或已过期,则调用 `fetcher` 委托获取新值,并将其缓存一段时间(由 `expiration` 指定)。
- 要求线程安全,防止重复计算(即多个线程同时请求同一个 key 时,只能有一个线程调用 `fetcher`)。
4. 不允许使用任何第三方库或 `System.Runtime.Caching`。
---
### ✅ 考察点:
- **线程安全**:使用 `ConcurrentDictionary`、`Lazy
- **泛型与委托**:理解泛型接口、委托传参、闭包行为。
- **缓存策略**:缓存项的过期时间处理。
- **性能优化**:避免重复计算、死锁、资源竞争。
- **设计模式**:工厂模式、装饰器模式或策略模式的灵活运用。
- **表达式树(加分项)**:如果能支持动态生成缓存访问逻辑,比如通过表达式树优化缓存访问,可作为加分项。
---
### 💡 示例用法:
```csharp
var factory = new CacheFactory();
var cache = factory.CreateCache
string result = cache.Get("key1", k =>
{
Console.WriteLine("Fetching...");
return "value1";
});
// 第二次调用不会输出 "Fetching..."
result = cache.Get("key1", k => "value1");
```
---
### 🧪 示例实现(参考):
你可以尝试自己实现这个缓存系统。如果你需要参考答案,我也可以提供一份线程安全、高性能的实现代码。
---
是否需要我提供参考实现?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐