[英]C#: “Using” Statements with HttpWebRequests/HttpWebResponses
乔恩·斯凯特( Jon Skeet )对我的SOApiDotNet代码(用于pre-alpha堆栈溢出API的.NET库)发表了评论(通过Twitter ):
@ maximz2005我从快速浏览源代码中注意到的一件事:您没有处置WebResponses。 “使用”语句FTW。
他指出,我需要将这些Web会话包装在“ using”语句中。 但是,我对此有一个疑问:我应该包装整个内容(从HttpWebRequest开始) , 还是应该在“ using”语句之外创建WebRequest,然后在其中包装Response ? 我感觉区别在于,在前者中,两个物体都将被丢弃-这是正确的吗?
提前致谢。
HttpWebRequest
本身是没有什么不同的一次性HttpWebResponse
。 您应该使用来包装一次性资源,以进行早期和确定的清理。 正确实现的IDisposable
模式允许多次调用Dispose
而不会出现任何问题,因此,即使外部using语句包装了资源,在其自身的dispose期间处理内部using语句资源也可以。
代码示例
var request = (HttpWebRequest)WebRequest.Create("example.com");
using (var response = (HttpWebResponse)request.GetResponse())
{
// Code here
}
离开合并范围时,将处理包裹在using(){}块中的所有内容(即,在第一个方括号内)。
到目前为止,我还没有使用过您的库(虽然看起来不错),但是我认为您应该显式处置您创建的每个IDisposable(=负责),并且不要返回到调用方。
旁注,因为我已经看到很多人都在努力处理多种事情:
using (var foo = SomeIDisposable) {
using (var bar = SomeOtherIDisposable) {
}
}
需要很多垂直空间才能写
using (var foo = SomeIDisposable)
using (var bar = SomeOtherIDisposable) {
}
为了防止内存泄漏,您应该在实现IDisposable的每个对象上调用Dispose。 您可以通过使用using关键字(无双关语)来确保Dispose方法被调用,因为它只是try-finally块的语法糖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.