Resharper 建议将 Using 语句转换为单个 "await Using"?
Resharper suggesting to convert Using statements to single "await Using"?
Resharper 建议将带有 await 关键字的 using 语句改进为单行 await using 语句。例如,以下代码片段:
private async Task<string> ReadResponseAsync(HttpContext context)
{
var originalBody = context.Response.Body;
try
{
using (var responseStream = new MemoryStream())
{
context.Response.Body = responseStream;
await _next(context).ConfigureAwait(false);
var response = context.Response;
response.Body.Seek(0, SeekOrigin.Begin);
using (var responseReader = new StreamReader(response.Body))
{
var responseContent = await responseReader
.ReadToEndAsync()
.ConfigureAwait(false);
response.Body.Seek(0, SeekOrigin.Begin);
await responseStream.CopyToAsync(originalBody)
.ConfigureAwait(false);
return responseContent;
}
}
}
finally
{
context.Response.Body = originalBody;
}
}
应用连续的 Resharper 建议后,代码变为以下内容:
private async Task<string> ReadResponseAsync(HttpContext context)
{
var originalBody = context.Response.Body;
try
{
await using var responseStream = new MemoryStream();
context.Response.Body = responseStream;
await _next(context).ConfigureAwait(false);
var response = context.Response;
response.Body.Seek(0, SeekOrigin.Begin);
using var responseReader = new StreamReader(response.Body);
var responseContent = await responseReader
.ReadToEndAsync()
.ConfigureAwait(false);
response.Body.Seek(0, SeekOrigin.Begin);
await responseStream.CopyToAsync(originalBody)
.ConfigureAwait(false);
return responseContent;
}
finally
{
context.Response.Body = originalBody;
}
}
这两个代码片段是否相似?这里实际上正在改进什么?我不理解 C# 的这个 using 语句特性。
C# 8.0 在使用方面引入了一些语法糖:
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations
如果您在限制范围变量的声明中应用 using(var responseReader
的 try 块),该范围将用作 using 的边界。
它真正做的就是让您跳过几个括号。但是它们仍然会在编译后的代码中。这使整个事情更具可读性。
当您接受该建议后,有两件事发生了变化:
await using
,您可以在实现新 IAsyncDisposable
的类型上使用它。它与常规 using
相同,只是它调用 DisposeAsync()
而不是 Dispose()
。
从 using
块到只是一个语句的变化。此建议只是为了尽量减少代码中的嵌套。一旦对象超出范围,就会调用 Dispose()
/DisposeAsync()
。您可以在 the documentation.
中阅读更多相关信息
这是两个独立的功能,您可以彼此独立使用(您可以将 await using
与块一起使用,或将 using
作为语句使用),但两者都是全新的语言。
Resharper 建议将带有 await 关键字的 using 语句改进为单行 await using 语句。例如,以下代码片段:
private async Task<string> ReadResponseAsync(HttpContext context)
{
var originalBody = context.Response.Body;
try
{
using (var responseStream = new MemoryStream())
{
context.Response.Body = responseStream;
await _next(context).ConfigureAwait(false);
var response = context.Response;
response.Body.Seek(0, SeekOrigin.Begin);
using (var responseReader = new StreamReader(response.Body))
{
var responseContent = await responseReader
.ReadToEndAsync()
.ConfigureAwait(false);
response.Body.Seek(0, SeekOrigin.Begin);
await responseStream.CopyToAsync(originalBody)
.ConfigureAwait(false);
return responseContent;
}
}
}
finally
{
context.Response.Body = originalBody;
}
}
应用连续的 Resharper 建议后,代码变为以下内容:
private async Task<string> ReadResponseAsync(HttpContext context)
{
var originalBody = context.Response.Body;
try
{
await using var responseStream = new MemoryStream();
context.Response.Body = responseStream;
await _next(context).ConfigureAwait(false);
var response = context.Response;
response.Body.Seek(0, SeekOrigin.Begin);
using var responseReader = new StreamReader(response.Body);
var responseContent = await responseReader
.ReadToEndAsync()
.ConfigureAwait(false);
response.Body.Seek(0, SeekOrigin.Begin);
await responseStream.CopyToAsync(originalBody)
.ConfigureAwait(false);
return responseContent;
}
finally
{
context.Response.Body = originalBody;
}
}
这两个代码片段是否相似?这里实际上正在改进什么?我不理解 C# 的这个 using 语句特性。
C# 8.0 在使用方面引入了一些语法糖:
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations
如果您在限制范围变量的声明中应用 using(var responseReader
的 try 块),该范围将用作 using 的边界。
它真正做的就是让您跳过几个括号。但是它们仍然会在编译后的代码中。这使整个事情更具可读性。
当您接受该建议后,有两件事发生了变化:
await using
,您可以在实现新IAsyncDisposable
的类型上使用它。它与常规using
相同,只是它调用DisposeAsync()
而不是Dispose()
。从
using
块到只是一个语句的变化。此建议只是为了尽量减少代码中的嵌套。一旦对象超出范围,就会调用Dispose()
/DisposeAsync()
。您可以在 the documentation. 中阅读更多相关信息
这是两个独立的功能,您可以彼此独立使用(您可以将 await using
与块一起使用,或将 using
作为语句使用),但两者都是全新的语言。