C#:"使用"语句与HttpWebRequests/HttpWebResponses

Max*_*sky 21 c# using using-statement httpwebrequest httpwebresponse

Jon Skeet 在我的SOApiDotNet代码(用于pre-alpha Stack Overflow API的.NET库)发表评论(通过推特):

@ maximz2005我注意到的一件事就是快速浏览源代码:你没有处理(原文如此)WebResponses.FTW"使用"声明.

他表示我需要将这些Web会话包装在"using"语句中.但是,我有一个问题:我应该包装整个事情,从HttpWebRequest开始,还是应该在"using"语句之外创建WebRequest然后将Response包装在里面?我感觉不同的是,在前者中,两个物体都会被处理掉 - 这是正确的吗?

提前致谢.

Dzm*_*uba 47

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

代码示例

var request = (HttpWebRequest)WebRequest.Create("example.com"); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Code here 
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这意味着你要做一个var request =(HttpWebRequest)WebRequest.Create("http://example.com"); 使用(var response =(HttpWebResponse)request.GetResponse()){//此处代码} (2认同)

Ben*_*zun 6

当你离开范围时,包含在using(){}块(即,在第一个括号内)的所有东西都会被处理掉.

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

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

using (var foo = SomeIDisposable) {
  using (var bar = SomeOtherIDisposable) {
  }
}
Run Code Online (Sandbox Code Playgroud)

你需要写很多垂直空间

using (var foo = SomeIDisposable)
using (var bar = SomeOtherIDisposable) {
}
Run Code Online (Sandbox Code Playgroud)