c# - 带有 ref/out 参数的方法的异步版本的元组与自定义结构

标签 c# async-await c#-5.0 out ref

考虑一个带有outref 参数的方法的 C# API,例如:

Person FindPerson(string name, out int searchTime);

让我们不要注意 out 和 ref 参数通常是设计味道这一事实,假设这是一个遗留 API,我们无法更改其现有方法的签名。但我们需要扩展 API 以支持异步执行(Windows Phone、WinRT 应用程序)。这是一个无法编译的实现:

Task<Person> FindPersonAsync(string name, out int searchTime)
{
    return Task.Factory.StartNew(() => this.FindPersonAsync(name, out searchTime));
}

由于 out 参数,此实现无法编译。所以我们必须更改 API 签名。一种方法是将结果从 task-of-person 更改为 task-of-tuple-of-person-and-int,即委托(delegate)实现将返回一个 Person 和 int 元组。第二种选择是定义自定义结构。

元组优势:使用元组提供了一种非常正式的方法,可用于轻松定义任何 API 的异步版本。可预测的实现(未定义新名称)。使用自定义结构需要为每种情况发明新的类型和成员。

自定义结构优势:使用元组的客户端代码需要使用 Item1Item2 名称来引用元组元素。这是模糊的。

我还没有找到任何建议,暂时决定使用元组。但我想知道在使用异步支持扩展 API 时是否有处理此类方法的推荐做法。

最佳答案

我不知道关于此事的任何最佳做法或建议;但根据我自己的经验,Tuple 使代码变得丑陋且毫无意义 - 当您看到一个时,Item1 是什么意思?

我总是使用自定义类并遵守一些约定:

  • 自定义类的名称以 Result 结尾,例如 FindPersonResult
  • 将类设计为 POCO,在构造函数中没有特殊逻辑。这可以防止您在使用系统的其他部分和其他 API 时出现任何意外(尤其是在序列化和反序列化时)。
  • 始终将集合字段/属性(数组、列表等)的初始值设置为空值,而不是 null。在许多情况下,这也有帮助。

请记住,这些只是我在这个问题上的个人经验,对我来说非常有效。

关于c# - 带有 ref/out 参数的方法的异步版本的元组与自定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15635710/

相关文章:

c# - 了解线程以及与 .NET 和 WPF 的同步

javascript - Axios 循环 promise

javascript - Node.js nodemailer - 等待新的 promise 解决错误

javascript - 我可以在没有 .then 的情况下使用 async await 吗?

c# - 使用 void 的异步异常处理

c# - 在数据访问层中使用异步是否有任何性能提升?

c# - 如何使用 WPF 项目中的 C++ 渲染

javascript - .html 文件是否可以识别 .NET scriptlet 还是必须将其转换为 aspx

c# - 检查列表中的字符串数组是否包含另一个列表中的字符串,反之亦然

c# - 使用 C# 通过当前文化信息获取时区