考虑一个具有out或ref参数的方法的 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,即委托实现将返回 Person 和 int 的元组。第二种选择是定义自定义结构。
元组优势:使用元组提供了一种非常正式的方法,可用于轻松定义任何 API 的异步版本。可预测的实现(未定义新名称)。使用自定义结构需要为每个此类情况发明新的类型和成员。
自定义结构的优势:使用元组的客户端代码需要使用Item1和Item2名称来引用 Tuple 元素。这是晦涩难懂的。
我没有找到任何建议,暂时决定使用元组。但我想知道在使用异步支持扩展 API 时是否有处理此类方法的推荐做法。