C#:“使用”带有 HttpWebRequests/HttpWebResponses 的语句
Jon Skeet 在我的 .googlecode.com" rel="noreferrer" title="nom">SOApiDotNet 代码(用于 pre-alpha Stack Overflow API 的 .NET 库):
@maximz2005 我注意到一件事 只需快速浏览源代码即可: 您不会处置(原文如此)WebResponses。 “使用”语句 FTW。
他指出我需要将这些 Web 会话包装在“using”语句中。但是,我对此有一个问题:我应该从 HttpWebRequest 开始包装整个事情,还是应该在“using”语句之外创建 WebRequest,然后将 Response 包装在其中?我有一种感觉,区别在于,在前者中,两个对象都会被丢弃 - 这是正确的吗?
提前致谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
与
HttpWebResponse
不同,HttpWebRequest
本身不是一次性的。您应该使用 using 包装一次性资源,以便尽早进行明确的清理。正确实现的 IDisposable 模式允许多次调用 Dispose,不会出现任何问题,因此即使外部 using 语句包装了在其自己的 dispose 期间处理内部 using 语句资源的资源,它仍然没问题。代码示例
HttpWebRequest
itself is not disposable unlikeHttpWebResponse
. You should wrap disposable resources with using to allow early and determined cleanup. Correctly implementedIDisposable
pattern allows multiple calls toDispose
without any issues so even the outer using statement wraps resource that during its own dispose disposes inner using statement resource it is still ok.Code example
当您离开作用域时,包含在 using () {} 块中(即第一个括号内)的所有内容都会被释放。
到目前为止我还没有使用过你的库(虽然看起来不错),但我认为你应该显式地处置你创建的每个 IDisposable (= 负责)并且不要返回给调用者。
旁注,因为我看到很多人在处理多种东西时苦苦挣扎:
你可以写而不是需要大量的垂直空间
Everything wrapped in a using () {} block (that is, inside of the first brackets) is disposed when you leave the scope.
I haven't used your library so far (seems nice though), but I'd argue that you should explicitly dispose every IDisposable you create (= are responsible for) and don't return to a caller.
A sidenote, since I've seen a lot of people struggling with multiple things to dispose: Instead of
which needs a lot of vertical space you can write
为了防止内存泄漏,您应该对每个实现 IDisposable 的对象调用 Dispose。您可以确保使用 using 关键字(无双关语)调用 Dispose 方法,因为它只是 try-finally 块的语法糖。
In order to prevent memory leaks you should call Dispose on every object that implements IDisposable. You can ensure that the Dispose method in called by using the using keyword (no pun intended) as it is just a syntactic sugar for try-finally block.