【问题标题】:C#: "Using" Statements with HttpWebRequests/HttpWebResponsesC#:带有 HttpWebRequests/HttpWebResponses 的“使用”语句
【发布时间】:2010-12-30 10:11:10
【问题描述】:

Jon Skeet made a comment (via Twitter) 在我的 SOApiDotNet 代码(一个用于 pre-alpha Stack Overflow API 的 .NET 库):

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

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

提前致谢。

【问题讨论】:

    标签: c# httpwebrequest using httpwebresponse using-statement


    【解决方案1】:

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

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

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

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

    需要很大的垂直空间你可以写

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

    【讨论】:

    • 您的第二段(我相信这是正确的)与第一段相矛盾。如果 using 块中的所有内容都已处理,则不需要内部 using 语句。
    • 查看我更新的帖子: using (...) 中的所有内容都在您离开以下块时被处理(这部分:{ ... })
    【解决方案2】:

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

    代码示例

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

    【讨论】:

    • 那么我应该在外面声明..Request,还是什么?
    • 是的,这意味着你会做一个 var request = (HttpWebRequest)WebRequest.Create("example.com"); using (var response = (HttpWebResponse)request.GetResponse()) { //代码在这里}
    • @Dzmitry,@Benjamin。我将本杰明的代码示例添加到您的答案中。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      相关资源
      最近更新 更多