繁体   English   中英

C#:在HttpWebRequests / HttpWebResponses中“使用”语句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM