Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-02 23:18:28

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,考察的是对 **泛型、委托、闭包、异步编程和函数式编程思想** 的综合理解与应用能力。

---

### 🧠 面试题:实现一个通用的“重试执行器”(RetryExecutor)

#### 背景:
在实际开发中,我们经常需要对某些可能失败的操作进行重试,比如网络请求、数据库访问等。你需要设计并实现一个高度可复用、线程安全、支持同步和异步操作的通用重试执行器。

---

### ✅ 题目要求:

请使用 C# 实现一个名为 `RetryExecutor` 的类或结构体,满足以下功能:

1. 提供一个方法 `Execute(Func)`,它接受一个返回值为 `T` 的函数,并在发生异常时自动重试。
2. 支持配置最大重试次数,默认为 3 次。
3. 支持设置每次重试之间的延迟时间(如指数退避)。
4. 支持同步和异步版本的方法:
- `T Execute(Func action)`
- `Task ExecuteAsync(Func> action)`
5. 支持传入自定义的异常过滤条件(例如只重试特定异常)。
6. 不允许在重试过程中产生副作用(即如果 `Func` 是纯函数,重试不影响其行为)。
7. 写出使用示例。

---

### 💡 示例代码框架(你可以补充完整):

```csharp
public class RetryExecutor
{
private int _maxRetries;
private TimeSpan _delay;
private Func _shouldRetry;

public RetryExecutor(int maxRetries = 3, TimeSpan? delay = null)
{
_maxRetries = maxRetries;
_delay = delay ?? TimeSpan.Zero;
_shouldRetry = ex => true; // 默认所有异常都重试
}

public RetryExecutor ShouldRetryOn(Func predicate)
{
_shouldRetry = predicate;
return this;
}

public T Execute(Func action)
{
// TODO: 实现同步版本
}

public async Task ExecuteAsync(Func> action)
{
// TODO: 实现异步版本
}
}
```

---

### 📌 使用示例:

```csharp
var executor = new RetryExecutor(maxRetries: 5, TimeSpan.FromSeconds(1))
.ShouldRetryOn(ex => ex is IOException || ex is TimeoutException);

int result = executor.Execute(() =>
{
// 可能失败的同步操作
return SomeFlakyOperation();
});

var asyncResult = await executor.ExecuteAsync(async () =>
{
return await SomeFlakyNetworkCallAsync();
});
```

---

### 🎯 考察点总结:

- 对 C# 委托和泛型的掌握程度。
- 异常处理与控制流设计。
- 对 `async/await` 和任务调度的理解。
- 线程安全性考虑(是否共享状态?如何避免?)。
- 函数式编程风格的应用(谓词传递)。
- 设计模式:策略模式、模板方法等。

---

如果你希望我提供参考答案或讲解思路,也可以告诉我 😄

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

上一篇: c#题例-2025-07-03 04:51:55

下一篇: c#题例-2025-07-02 16:31:47

精华推荐