我找到了以下代码:
using (var requestMessage = new HttpRequestMessage(HttpMethod.Delete, endpoint))
{
...
HttpResponseMessage response = await _client.SendAsync(requestMessage);
...
}
我以前没见过这种图案。
我知道
System.Net.Http.HttpRequestMessage
实现了 IDisposable
,但这是否意味着我们应该将其包装在 using
语句中?
是的,你应该这样做。 文档认可这种做法。
如果您的应用程序仅使用实现
的对象 接口,你应该调用对象的IDisposable
当您使用完毕后实施。取决于您的 编程语言,您可以通过以下两种方式之一来完成此操作:IDisposable.Dispose
- 通过使用语言构造,例如 C# 和 Visual Basic 中的
语句以及 F# 中的using
语句或use
函数。using
- 通过将对
实现的调用包装在 try/finally 块中。IDisposable.Dispose
不过,您不必将代码块“包装”在
using
语句中。从 C# 8 开始,您还可以使用 using
声明。只需声明一个常规变量,并在开头添加 using
即可。
HttpRequestMessage
之所以实现IDisposable
,是因为它的Content
是IDisposable
。那为什么需要处置HttpContent
呢?因为您可以使用其子类 Stream
将内容作为 Stream
读取,或者将内容作为 StreamContent
提供。这些都涉及到需要处理的流。查看这些 API 的源代码以获取更多信息。
从技术上来说,如果你不做上述任何事情,HttpRequestMessage.Dispose
什么也做不了,但谁知道未来会发生什么变化呢?