C#中await表达式用作方法参数:是新特性还是罕见用法?
关于将await表达式作为方法参数的用法解答
这既不是C#的新特性,也不是什么罕见的特殊用法——它就是await运算符的常规合法用法,和ref/out/in这类参数修饰符没有任何关系。
核心原理
await本质是一个运算符,作用是等待Task/Task<T>完成,并提取其返回结果。await streamTask本身就是一个完整的表达式,它的返回值类型就是streamTask对应的泛型参数(这里是Stream)。既然是表达式,自然可以直接作为参数传递给需要对应类型参数的方法——就像你可以把1+1直接传给需要int参数的方法一样。
等价写法对比
你看到的代码:
var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(await streamTask);
完全等价于先把await结果赋值给变量再传参的写法:
var stream = await streamTask; var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(stream);
两者功能、性能完全一致,只是写法更紧凑。
为什么看起来少见?
只是很多开发者习惯先把异步操作的结果赋值给变量(方便调试、代码可读性更强),但直接传await表达式的写法从C# 5引入async/await特性时就已经支持了,属于语法规范内的常规操作。
再举个简单例子
比如你有一个返回Task<string>的异步方法,想直接把它的结果传给一个接收string参数的方法:
async Task<string> GetUserNameAsync() { await Task.Delay(100); return "Alice"; } void ShowUserName(string name) => Console.WriteLine($"Hello, {name}"); // 直接用await表达式作为参数 ShowUserName(await GetUserNameAsync());
这和你遇到的代码逻辑完全一致,都是将await表达式的结果直接作为方法参数传递。
内容的提问来源于stack exchange,提问作者DP3PO
相关产品推荐
相关产品推荐

