我可以在C#中声明命名的异步元组函数吗?

Dom*_*air 5 c# asynchronous tuples

C#7允许我们声明返回命名元组的函数,所以现在可以使用如下所示的声明.

(int quotient, int remainder) = GetDivisionResults(17, 5);
Run Code Online (Sandbox Code Playgroud)

我需要处理来自HTTP客户端请求的响应并从中提取两个值,我想异步这样做.允许以下内容

public static async Task<<Tuple<string,string>> GetRequiredReturnValuesFromResponse(string response)
Run Code Online (Sandbox Code Playgroud)

我的简单问题是,是否有可能以与我可以沿着线同步操作的函数相同的方式命名输出字符串,如下所示?

public static async Task<Tuple< string OrderNumber,string OriginalId>> GetRequiredReturnValuesFromResponse(string response)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

您不能命名Tuple元素 - 仅ValueTuple元素.C#7元组支持基于ValueTuple类型.但即使这样,名称也不属于ValueTuple它们......它们与返回类型(或参数类型)一起存储在属性中.

所以你绝对可以声明:

public static async Task<(string OrderNumber, string OriginalId)>
    GetRequiredReturnValuesFromResponse(string response)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

var tuple = await GetRequiredReturnValuesFromResponse(response);
Console.WriteLine(tuple.OrderNumber);
Console.WriteLine(tuple.OriginalId);
Run Code Online (Sandbox Code Playgroud)

甚至:

var (number, id) = await GetRequiredReturnValuesFromResponse(response);
Run Code Online (Sandbox Code Playgroud)

但是,在显式使用时,您无法命名元素ValueTuple(除非您明确指定命名属性,我相信编译器会警告您反对)或者Tuple根本不使用.

就个人而言,我建议不要将ValueTuple类型放在公共 API中; 我通常将它们视为内部实现的一种权宜之计,我可能决定稍后迁移到更完全封装的类型.但这只是个人观点,并不代表你能做什么.