21

Jon Skeet对我的SOApiDotNet代码(pre-alpha Stack Overflow API 的 .NET 库)发表了评论(通过 Twitter ):

@ maximz2005 我从快速浏览源代码中注意到的一件事:您没有处理(原文如此)WebResponses。“使用”语句 FTW。

他指出我需要将这些 Web 会话包装在“使用”语句中。但是,我对此有一个问题:我应该包装整个事情,从 HttpWebRequest 开始还是应该在“使用”语句之外创建 WebRequest,然后将 Response 包装在里面?我有一种感觉,不同之处在于,在前者中,两个对象都会被处理 - 这是正确的吗?

提前致谢。

4

3 回答 3

48

HttpWebRequest本身不是一次性的,不像HttpWebResponse。您应该使用 using 包装一次性资源,以便进行早期和确定的清理。正确实现IDisposable的模式允许多次调用而Dispose没有任何问题,因此即使外部 using 语句包装资源,在其自己的处置期间处置内部 using 语句资源它仍然可以。

代码示例

var request = (HttpWebRequest)WebRequest.Create("example.com"); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Code here 
}
于 2009-12-28T08:28:03.530 回答
6

当您离开作用域时,包装在 using () {} 块中的所有内容(即在第一个括号内)都会被释放。

到目前为止我还没有使用过你的库(虽然看起来不错),但我认为你应该明确地处理你创建的每个 IDisposable (= 负责)并且不要返回给调用者。

一个旁注,因为我看到很多人都在为处理多种事情而苦苦挣扎:而不是

using (var foo = SomeIDisposable) {
  using (var bar = SomeOtherIDisposable) {
  }
}

这需要很多垂直空间你可以写

using (var foo = SomeIDisposable)
using (var bar = SomeOtherIDisposable) {
}
于 2009-12-28T08:27:52.737 回答
1

为了防止内存泄漏,您应该在每个实现 IDisposable 的对象上调用 Dispose。您可以确保使用 using 关键字(不是双关语)调用 Dispose 方法,因为它只是 try-finally 块的语法糖。

于 2009-12-28T09:09:27.847 回答