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

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

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

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

提前致谢。

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

代码示例

 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块的语法糖。